我可以在SQL Server的add column语句中创建命名的默认约束吗?

Gle*_*nnS 144 sql-server constraints alter-table code-maintainability

在SQL Server中,我在表上有一个新列:

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL
Run Code Online (Sandbox Code Playgroud)

这失败是因为我指定了NOT NULL而没有指定默认约束.该表不应具有默认约束.

为了解决这个问题,我可以使用默认约束创建表,然后将其删除.

但是,似乎没有任何方法可以指定默认约束应该作为此语句的一部分命名,因此我摆脱它的唯一方法是使用一个存储过程在sys.default_constraints中查找它表.

对于可能发生很多事情的操作来说,这有点混乱/冗长.有没有人有更好的解决方案呢?

Joe*_*lli 202

这应该工作:

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL
Run Code Online (Sandbox Code Playgroud)

  • 为什么不将“ NOT NULL”放在数据类型旁边?将其放在约束之后可能在语法上是有效的,但将其放在那里似乎令人困惑。 (9认同)
  • @Tullo_x86 SSMS 和 SSDT 中的“生成脚本...”工具仍然默认将“NOT NULL”部分放在类型、默认约束和临时表“GENERATED”位之后的行的最末尾。太可怕了。 (2认同)

Mit*_*eat 91

ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个接受的答案,因为我可以删除默认约束而不必担心失去NOT NULL约束. (21认同)
  • @RogerWillcocks你是对的,但是在读它时它更清楚NOT NULL与约束是分开的. (11认同)
  • @EleventhDoctor这没有任何意义.NOT NULL不是约束的一部分,drop语句只引用约束名称 (6认同)

Shn*_*ugo 23

我想补充一些细节:

最重要的提示是:您永远不应该创建没有明确名称的约束!

未命名约束的最大问题:当您在各种客户机器上执行此操作时,您将在每台机器上获得不同/随机的名称
任何未来的升级脚本都将是一个真正令人头疼的问题......

一般建议是:

  • 没有名字就没有约束!
  • 使用一些命名约定,例如
    • DF_TableName_ColumnName 对于默认约束
    • CK_TableName_ColumnName 对于检查约束
    • UQ_TableName_ColumnName 对于唯一约束
    • PK_TableName 对于主键约束

一般语法是

TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>
Run Code Online (Sandbox Code Playgroud)

在这里试试这个

您可以向每列添加更多约束,并且可以像在逗号后添加列一样添加其他约束:

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
Run Code Online (Sandbox Code Playgroud)

--插入一些数据

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);
Run Code Online (Sandbox Code Playgroud)