ฉันต้องการเพิ่มรายละเอียดเนื่องจากคำตอบที่มีอยู่ค่อนข้างบาง :
คำแนะนำที่สำคัญที่สุดคือ: คุณไม่ควรสร้างข้อ จำกัด โดยไม่มีชื่อชัดเจน!
ปัญหาที่ใหญ่ที่สุดที่มีข้อ จำกัด ที่ไม่มีชื่อ : เมื่อคุณเรียกใช้งานบนเครื่องลูกค้าที่หลากหลายคุณจะได้รับชื่อที่แตกต่างกันไปในแต่ละชื่อ
ใด ๆสคริปต์การอัพเกรดในอนาคตจะมีอาการปวดหัวจริง ...
คำแนะนำทั่วไปคือ:
- ไม่มีข้อ จำกัด หากไม่มีชื่อ!
- ใช้หลักการตั้งชื่อบางอย่างเช่น
DF_TableName_ColumnName
สำหรับข้อ จำกัด เริ่มต้น
CK_TableName_ColumnName
สำหรับข้อ จำกัด การตรวจสอบ
UQ_TableName_ColumnName
สำหรับข้อ จำกัด ที่ไม่ซ้ำกัน
PK_TableName
สำหรับข้อ จำกัด คีย์หลัก
ไวยากรณ์ทั่วไปคือ
TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>
ลองที่นี่
คุณสามารถเพิ่มข้อ จำกัด เพิ่มเติมในแต่ละคอลัมน์และคุณสามารถเพิ่มข้อ จำกัด เพิ่มเติมเช่นเดียวกับที่คุณเพิ่มคอลัมน์หลังเครื่องหมายจุลภาค:
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
- แทรกข้อมูลบางส่วน
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);