193

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

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

这失败了,因为我在没有指定默认约束的情况下指定了 NOT NULL。该表不应有默认约束。

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

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

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

4

5 回答 5

273

这应该有效:

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL
于 2010-09-22T14:06:30.330 回答
126
ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)
于 2010-09-22T14:06:32.807 回答
31

我想补充一些细节:

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

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

一般建议是:

  • 没有名字就没有约束!
  • 使用一些命名约定,例如
    • 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);
于 2019-12-16T08:14:49.757 回答
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
于 2020-01-18T11:26:25.977 回答
0

在向大表添加新列和默认值时,我使用以下内容。分别执行每一行:

ALTER TABLE dbo.[TableName] ADD [ColumnName] BIT NULL; /*null>no table rebuild*/

UPDATE rf SET rf.[ColumnName] = 0 FROM dbo.[TableName] rf WHERE rf.[ColumnName] IS NULL;

ALTER TABLE dbo.[TableName] ALTER COLUMN [ColumnName] BIT NOT NULL;

ALTER TABLE dbo.[TableName] ADD CONSTRAINT DF_[TableName]_[ColumnName] DEFAULT 0 FOR [ColumnName];
于 2021-11-07T19:59:06.967 回答