SQL Server'da bir sütun ekle deyiminde adlandırılmış bir varsayılan kısıt oluşturabilir miyim?


163

SQL Server'da, bir tabloda yeni bir sütun var:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

Varsayılan bir kısıtlama belirtmeden NOT NULL belirttiğiniz için bu başarısız olur. Tablonun varsayılan bir kısıtlaması olmamalıdır.

Bu sorunu aşmak için, tabloyu varsayılan kısıtlamayla oluşturabilir ve sonra kaldırabilirim.

Ancak, varsayılan kısıtlamanın bu ifadenin bir parçası olarak adlandırılması gerektiğini belirtmenin bir yolu yoktur, bu yüzden ondan kurtulmanın tek yolu sys.default_constraints içinde görünen bir saklı yordam olması tablo.

Bu, çok fazla olması muhtemel bir işlem için biraz dağınık / ayrıntılıdır. Bunun için daha iyi çözümleri olan var mı?

Yanıtlar:


224

Bu çalışmalı:

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL

1
2012 yılında da çalışıyor. Kanlı detaylar: msdn.microsoft.com/en-us/library/ms187742.aspx
adam77

10
Neden NOT NULLveri türüne bitişik yerleştirilmiyor ? Kısıtlamadan sonra sözdizimsel olarak geçerli olabilir, ancak oraya koymak kafa karıştırıcı gibi görünüyor.
Tullo_x86

102
ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)

22
NOT NULL kısıtlamasını kaybetme konusunda endişelenmeden varsayılan kısıtlamayı bırakabildiğim için bunu kabul edilen cevaba tercih ederim.
EleventhDoctor

7
@EleventhDoctor Bu hiç mantıklı değil. NOT NULL, kısıtlamanın bir parçası değildir ve drop ifadesi sadece kısıtlama adını referans alır
Roger Willcocks

11
@RogerWillcocks Haklısınız, ancak okumadan sonra NOT NULL değerinin kısıtlamadan ayrı olduğu daha açık.
17ux

10

Mevcut cevaplar oldukça ince olduğu için bazı ayrıntılar eklemek istiyorum :

En önemli ipucu: Asla açık bir isim olmadan bir kısıtlama oluşturmamalısınız!

Adsız kısıtlamalarla ilgili en büyük sorun : Bunu çeşitli müşteri makinelerinde yürüttüğünüzde , her birinde farklı / rastgele adlar alacaksınız . Gelecekteki
herhangi bir yükseltme komut dosyası gerçek bir baş ağrısı olacak ...

Genel tavsiye:

  • İsimsiz kısıtlama yok!
  • Bazı adlandırma kurallarını kullanın, ör.
    • DF_TableName_ColumnName varsayılan bir kısıtlama için
    • CK_TableName_ColumnName çek kısıtlaması için
    • UQ_TableName_ColumnName benzersiz bir kısıtlama için
    • PK_TableName birincil anahtar kısıtlaması için

Genel sözdizimi

TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>

Bunu burada deneyin

Her sütuna daha fazla kısıtlama ekleyebilir ve tıpkı virgülden sonra sütun eklerken ek kısıtlamalar ekleyebilirsiniz:

CREATE TABLE dbo.SomeOtherTable(TheIdThere INT NOT NULL CONSTRAINT PK_SomeOtherTable PRIMARY KEY)
GO
CREATE TABLE dbo.TestTable
(
 --define the primary key
 ID INT IDENTITY NOT NULL CONSTRAINT PK_TestTable PRIMARY KEY

 --let the string be unique (results in a unique index implicitly)
,SomeUniqueString VARCHAR(100) NOT NULL CONSTRAINT UQ_TestTable_SomeUniqueString UNIQUE

 --define two constraints, one for a default value and one for a value check
,SomeNumber INT NULL CONSTRAINT DF_TestTable_SomeNumber DEFAULT (0)
                     CONSTRAINT CK_TestTable_SomeNumber_gt100 CHECK(SomeNumber>100)

 --add a foreign key constraint
,SomeFK INT NOT NULL CONSTRAINT FK_TestTable_SomeFK FOREIGN KEY REFERENCES dbo.SomeOtherTable(TheIdThere)

 --add a constraint for two columns separately
,CONSTRAINT UQ_TestTable_StringAndNumber UNIQUE(SomeFK,SomeNumber)
);
GO

- biraz veri ekle

INSERT INTO dbo.SomeOtherTable VALUES(1);
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) VALUES('hello',111,1);
GO
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) 
VALUES('fails due to uniqueness of 111,1',111,1);

1

Aşağıdaki script-

ALTER TABLE DEMO_TABLE
ADD Column1 INT CONSTRAINT Def_Column1 DEFAULT(3) NOT NULL,
    Column2 VARCHAR(10) CONSTRAINT Def_Column2 DEFAULT('New') NOT NULL;
GO
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.