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


163

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

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

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

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

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

对于可能经常发生的操作而言,这有点混乱/冗长。有人对此有更好的解决方案吗?

Answers:


224

这应该工作:

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

1
在2012年也可以使用。
血腥

10
为什么不将NOT NULL相邻的数据类型放在一起?将其放在约束之后可能在语法上是有效的,但是将其放在那里似乎令人困惑。
Tullo_x86

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

22
我更喜欢此选项,因为我可以删除默认约束,而不必担心丢失NOT NULL约束。
EleventhDoctor

7
@EleventhDoctor这没有任何意义。NOT NULL不是约束的一部分,并且drop语句仅引用约束名称
Roger Willcocks

11
@RogerWillcocks您是正确的,但阅读它会更清楚地知道NOT NULL与约束是分开的。
deluxxxe

10

我想补充一些细节,因为现有的答案很薄

最重要的提示是:切勿在没有显式名称的情况下创建约束!

带有未命名约束的最大问题:在各种客户计算机上执行此操作时,每台计算机上都会获得不同/随机的名称
任何将来的升级脚本都会让人头疼。

一般建议是:

  • 没有名字就没有约束!
  • 使用一些命名约定,例如
    • 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);

1

尝试像下面的脚本-

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.