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

时间:2010-09-22 14:02:58

标签: sql-server constraints alter-table code-maintainability

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

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

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

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

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

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

4 个答案:

答案 0 :(得分:187)

这应该有效:

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

答案 1 :(得分:79)

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

答案 2 :(得分:2)

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

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

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

一般建议是:

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

答案 3 :(得分: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