Tôi có thể tạo một ràng buộc mặc định được đặt tên trong một câu lệnh thêm cột trong SQL Server không?


163

Trong SQL Server, tôi có một cột mới trên bảng:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

Điều này không thành công vì tôi chỉ định KHÔNG NULL mà không chỉ định ràng buộc mặc định. Bảng không nên có một ràng buộc mặc định.

Để giải quyết vấn đề này, tôi có thể tạo bảng với ràng buộc mặc định và sau đó xóa nó.

Tuy nhiên, dường như không có cách nào để xác định rằng ràng buộc mặc định nên được đặt tên như một phần của tuyên bố này, vì vậy cách duy nhất để loại bỏ nó là có một thủ tục được lưu trữ trong sys.default_constraint bàn.

Đây là một chút lộn xộn / dài dòng cho một hoạt động có khả năng xảy ra rất nhiều. Có ai có bất kỳ giải pháp tốt hơn cho điều này?

Câu trả lời:


224

Điều này sẽ làm việc:

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

1
Hoạt động trong năm 2012 cũng vậy. Chi tiết về tin
đồn

10
Tại sao không đặt NOT NULLliền kề với kiểu dữ liệu? Nó có thể có giá trị về mặt cú pháp để đặt nó sau khi ràng buộc, nhưng có vẻ khó hiểu khi đặt nó ở đó.
Tullo_x86

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

22
Tôi thích câu trả lời được chấp nhận này vì tôi có thể bỏ ràng buộc mặc định mà không lo mất ràng buộc KHÔNG NULL.
EleventhDoctor

7
@EleventhDoctor Điều đó không có ý nghĩa. NOT NULL không phải là một phần của ràng buộc và câu lệnh thả chỉ tham chiếu tên ràng buộc
Roger Willcocks

11
@RogerWillcocks Bạn đúng, nhưng rõ ràng hơn khi đọc nó rằng KHÔNG NULL tách biệt với ràng buộc.
deluxxxe

10

Tôi muốn thêm một số chi tiết, vì các câu trả lời hiện có khá mỏng :

Gợi ý quan trọng nhất là: Bạn không bao giờ nên tạo ra một ràng buộc mà không có tên rõ ràng!

Vấn đề lớn nhất với các ràng buộc không tên : Khi bạn thực hiện điều này trên các máy khách hàng khác nhau, bạn sẽ nhận được các tên khác nhau / ngẫu nhiên trên mỗi máy.
Bất kỳ kịch bản nâng cấp trong tương lai sẽ là một vấn đề đau đầu thực sự ...

Lời khuyên chung là:

  • Không ràng buộc mà không có tên!
  • Sử dụng một số quy ước đặt tên, vd
    • DF_TableName_ColumnName cho một ràng buộc mặc định
    • CK_TableName_ColumnName cho một ràng buộc kiểm tra
    • UQ_TableName_ColumnName cho một ràng buộc duy nhất
    • PK_TableName cho một ràng buộc khóa chính

Cú pháp chung là

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

Hãy thử nó ở đây

Bạn có thể thêm nhiều ràng buộc hơn cho mỗi cột và bạn có thể thêm các ràng buộc bổ sung giống như bạn thêm các cột sau dấu phẩy:

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

- xác nhận một số dữ liệu

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

Hãy thử như kịch bản dưới đây-

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.