Bisakah saya membuat batasan default bernama dalam pernyataan kolom tambahkan di SQL Server?


163

Di SQL Server, saya memiliki kolom baru di atas meja:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

Ini gagal karena saya menentukan TIDAK NULL tanpa menentukan batasan default. Tabel seharusnya tidak memiliki batasan default.

Untuk menyiasatinya, saya bisa membuat tabel dengan batasan default dan kemudian menghapusnya.

Namun, tampaknya tidak ada cara untuk menentukan bahwa batasan default harus dinamai sebagai bagian dari pernyataan ini, jadi satu-satunya cara saya untuk menghilangkannya adalah dengan memiliki prosedur tersimpan yang mencari di sys.default_constraints meja.

Ini agak berantakan / bertele-tele untuk operasi yang kemungkinan akan banyak terjadi. Adakah yang punya solusi yang lebih baik untuk ini?

Jawaban:


224

Ini seharusnya bekerja:

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

1
Bekerja di 2012 juga. Detail
berdarah

10
Mengapa tidak menempatkan yang NOT NULLberdekatan dengan tipe data? Secara sintaksis mungkin valid untuk meletakkannya setelah batasan, tetapi tampaknya membingungkan untuk meletakkannya di sana.
Tullo_x86

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

22
Saya lebih suka ini daripada jawaban yang diterima karena saya bisa menghilangkan batasan default tanpa khawatir kehilangan batasan NOT NULL.
EleventhDoctor

7
@EleventhDoctor Itu tidak masuk akal. NOT NULL bukan bagian dari kendala dan pernyataan drop hanya merujuk nama kendala
Roger Willcocks

11
@RogerWillcocks Anda benar, tetapi lebih jelas setelah membacanya bahwa NOT NULL terpisah dari kendala.
deluxxxe

10

Saya ingin menambahkan beberapa detail, karena jawaban yang ada agak tipis :

Petunjuk paling penting adalah: Anda seharusnya tidak pernah membuat batasan tanpa nama eksplisit!

Masalah terbesar dengan kendala yang tidak disebutkan namanya : Ketika Anda menjalankan ini pada berbagai mesin pelanggan, Anda akan mendapatkan nama yang berbeda / acak pada masing-masingnya.
Setiap script upgrade masa depan akan menjadi sakit kepala ...

Nasihat umum adalah:

  • Tidak ada kendala tanpa nama!
  • Gunakan konvensi penamaan misalnya
    • DF_TableName_ColumnName untuk kendala standar
    • CK_TableName_ColumnName untuk kendala pemeriksaan
    • UQ_TableName_ColumnName untuk kendala yang unik
    • PK_TableName untuk batasan kunci primer

Sintaks umumnya adalah

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

Coba ini di sini

Anda bisa menambahkan lebih banyak kendala ke setiap kolom dan Anda bisa menambahkan kendala tambahan sama seperti Anda menambahkan kolom setelah koma:

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

- masukkan beberapa data

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

Coba seperti di bawah ini skrip-

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.