我想要添加一些细节:
最重要的提示是:您绝对不能创建没有明确名称的约束!
未命名约束面临的最大问题:当您在不同的客户机上执行此操作时,每个客户机都会得到不同/随机的名称。
任何将来的升级脚本都将是一个真正的头疼…
一般建议为:
- 不要使用没有名称的约束!
- 使用一些命名约定,例如:
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
(
ID INT IDENTITY NOT NULL CONSTRAINT PK_TestTable PRIMARY KEY
,SomeUniqueString VARCHAR(100) NOT NULL CONSTRAINT UQ_TestTable_SomeUniqueString UNIQUE
,SomeNumber INT NULL CONSTRAINT DF_TestTable_SomeNumber DEFAULT (0)
CONSTRAINT CK_TestTable_SomeNumber_gt100 CHECK(SomeNumber>100)
,SomeFK INT NOT NULL CONSTRAINT FK_TestTable_SomeFK FOREIGN KEY REFERENCES dbo.SomeOtherTable(TheIdThere)
,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);
NOT NULL
放在数据类型旁边呢?尽管将其放在约束条件之后在语法上是有效的,但是这样做似乎会令人感到困惑。 - Tullo_x86NOT NULL
部分放在类型、默认约束和时间表GENERATED
位之后的最后。这太丑陋了。 - Dai