Varolan bir sütun için varsayılan değer nasıl ayarlanır


375

SQL Server 2008'de çalışmıyor:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

Hata:

'SET' anahtar kelimesinin yanında yanlış sözdizimi.

Neyi yanlış yapıyorum?


1
MSDN ALTER TABLE ne diyorsun ...? msdn.microsoft.com/tr-tr/library/ms187742(SQL.90).aspx
gbn



1
Bu mysql sözdizimidir.
Benjamin Goodacre

neden herkes bir standarda bağlı kalamıyor? (gerçek bir soru değil, microsoft ve mysql veya diğer satıcılara atıfta bulunan herkes). bunu yapmanın standart bir yolu var mı?
joedotnot

Yanıtlar:


566

Bu SQL Server'da çalışacaktır:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;

62
Kısıtlama adı belirtmek için +1, bu nedenle SQL Server rastgele bir ad oluşturmaz.
HardCode

36
MSSQL, varsayılan değerleri "kısıtlamalar" olarak adlandırmak için gariptir. Bir şey varsa, bunlar rahatlamadır ; tersi bir kısıtlama nedeniyle! Daha az şeyi değil, daha fazla şeyi geçerli kılar.
Roman Starkov

4
Şöyle bir alternatif düşünürseniz garip değil: Varsayılan kısıtlama, sütunu belirtmezseniz MSSQL'in hata atmasını önler. Yani kullanıcı için bir kısıtlama değil, MSSQL için bir kısıtlamadır.
Jonny Piazzi

4
Bu, yalnızca sütunda mevcut bir varsayılan kısıtlama yoksa çalışır.
pmcilreavy

4
@fallenidol Bu, yalnızca sütunda mevcut bir varsayılan kısıtlama yoksa çalışır. Doğru, çünkü tanım gereği birden fazla varsayılan değere sahip olamazsınız ...
Yuck

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
Bu MSSQL'de çalışır, ancak sahne arkasında yarattığı kısıtlamayı adlandırmaması dezavantajına sahiptir (yukarıdaki yüksek oylama cevabına bakınız).
Contango

10
@Contango Ben bunlardan birini değiştirmek için gereken offchance her kısıtlama adlandırma rahatsız etmemek daha iyi olduğunu düşünüyorum. Sadece otomatik olarak adlandırılmış kısıtlamaları bırakmak için bir prosedür yazın ve bir daha asla ad vermek zorunda kalmazsınız + diğer tüm isimsiz olanlarla başa çıkabilir
JonnyRaa 15:15

3
@Jonny Leeds. İyi bir nokta. Ayrıca veritabanı şemasını değiştirmeye (veya basitçe anlamaya) herkes için iyi bir dokümantasyon olduğu için kısıtlamaları da adlandırmak istiyorum. Bu, bir kişilik bir ekipte çalışan yalnız bir operatör ise daha az önemlidir.
Contango

1
(EESH! Satır özetlerinin olmaması için özür dilerim - netlik için aşağıda yapıştırıldı!) Yeniden çalıştırılabilir olması gerekiyordu ve zaten yapılıp yapılmadığını kontrol etmek için bu yolu buldum ... EĞER VARSA (SEÇİN * FROM information_schema.columns NEREDE table_name = 'myTable' AND column_name = 'myColumn' AND Table_schema = 'myDBO' VE column_default IS NULL) [myDBO] TÜMÜNÜ BAŞLAT [myDBO]. [myTable] 10: 04'te [myColumn] END
Dave

4
Yalnızca bir varsayılan kısıtlama varsa ... neden adlandırmanız gerekiyor? Diğer veritabanı motorlarının, sütun adı dışında herhangi bir adı olmayan bir sütunun varsayılan değerini eklemek, güncellemek, kaldırmak için sözdizimi sağladığı anlaşılmaktadır. Yukarıdaki kod, varsayılan olarak zaten varsa, btw başarısız olur. SQL Server'ın yalnızca varsayılan kısıtlamanın adını tanımlamak için bir sistem tablosuna karmaşık bir birleşim gerektirmesi saçmadır, çünkü bir sütunda yalnızca bir varsayılan kısıtlama olabilir.
Triynko

51

bunun için değiştirme sütunu kullanılamaz, bunun yerine add'i kullanın

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn

9
bu cevabın neden oy almadığını bilmiyorum. Daha öncekiyle tamamen aynı ve daha önce cevaplandı ...
spankmaster79

30

Bunu yapmanın doğru yolu aşağıdaki gibidir:

  1. Komutu çalıştırın:

    sp_help [table name] 
  2. Öğesinin adını kopyalayın CONSTRAINT.

  3. Bırak DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. Aşağıdaki komutu çalıştırın:

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]

4
StackOverflow.com yalnızca İngilizce'dir. Portekiz sitesi pt.stackoverflow.com
Martin Smith

Bu, diğer cevaplara yeni bir şey eklemez, manuel bir yöntemdir - yazılamaz ve "doğru yol" olarak belirtilir ..
Andre Figueiredo

12

Hoodaticus'un çözümü mükemmeldi, teşekkür ederim, ama aynı zamanda yeniden çalıştırılabilir olması gerekiyordu ve yapılıp yapılmadığını kontrol etmek için bu yolu buldum ...

IF EXISTS(SELECT * FROM information_schema.columns 
           WHERE table_name='myTable' AND column_name='myColumn' 
             AND Table_schema='myDBO' AND column_default IS NULL) 
BEGIN 
  ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
END

7

Bir sütun için varsayılan değerin değiştirilebileceği iki senaryo vardır,

  1. Tablo oluştururken
  2. Mevcut bir tablo için mevcut sütunu değiştirin.

  1. Tablo oluşturma / yeni sütun oluşturma sırasında.

Sorgu

create table table_name
(
    column_name datatype default 'any default value'
);
  1. Mevcut bir tablo için mevcut sütunu değiştirme

Bu durumda, SQL sunucum varolan varsayılan kısıtlama değerini değiştirmeye izin vermiyor. Bu nedenle, varsayılan değeri değiştirmek için, var olan sistem veya kullanıcı tarafından oluşturulan varsayılan kısıtlamayı silmemiz gerekir. Ve bundan sonra belirli bir sütun için varsayılan değer ayarlanabilir.

Bazı adımları izleyin:

  1. Sütunlar için mevcut tüm varsayılan değer kısıtlamalarını listeleyin.

Bu sistem veritabanı yordamını yürütün, tablo adını parametre olarak alır. Tablodaki tüm sütunlar için tüm kısıtlamaların listesini döndürür.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. Bir sütun için mevcut varsayılan kısıtlamayı kaldırın.

Sözdizimi:

alter table 'table_name' drop constraint 'constraint_name'
  1. Bu sütun için yeni varsayılan değer kısıtlaması ekleyin:

Sözdizimi:

alter table 'table_name' add default 'default_value' for 'column_name'

alkış @ !!!


5

varsayılan adıyla bir kısıtlama zaten mevcutsa:

-- Drop existing default constraint on Employee.CityBorn
DECLARE @default_name varchar(256);
SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);

-- Add default constraint on Employee.CityBorn
ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;

4
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]

4

Aşağıdaki sözdizimini kullanabilirsiniz, Daha fazla bilgi için bu soruya ve yanıtlara bakın: SQL Server'da varolan bir tabloya varsayılan değeri olan bir sütun ekleme

Sözdizimi:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

Misal :

ALTER TABLE SomeTable
ADD SomeCol Bit NULL --Or NOT NULL.
CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is 
autogenerated.
DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

Diğer yol :

Tabloya sağ tıklayın ve Tasarım'a tıklayın, ardından varsayılan değeri ayarlamak istediğiniz sütuna tıklayın.

Ardından sayfanın altına varsayılan bir değer veya bağlama ekleyin: dize için '1' veya int için 1 gibi bir şey.


3

Daha önce boş olan mevcut sütunu değiştirmek için 3 basit adım bulundu

update   orders
set BasicHours=0 where BasicHours is null

alter table orders 
add default(0) for BasicHours

alter table orders 
alter  column CleanBasicHours decimal(7,2) not null 

3

İlk bırakma kısıtlamaları

https://stackoverflow.com/a/49393045/2547164

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

İkincisi varsayılan değer oluştur

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]

2

Aşağıdaki komutu deneyin;

ALTER TABLE Person11
ADD CONSTRAINT col_1_def
DEFAULT 'This is not NULL' FOR Address

1

Yuck'ın betiğin bir kereden fazla hatasız çalıştırılmasına izin veren bir onayla verdiği yanıt gibi. (information_schema.columns kullanmaktan daha az kod / özel dizgi)

IF object_id('DF_SomeName', 'D') IS NULL BEGIN
    Print 'Creating Constraint DF_SomeName'
   ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
END
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.