题 将具有默认值的列添加到SQL Server中的现有表


如何将具有默认值的列添加到现有表中 SQL Server 2000 / SQL Server 2005


2297
2017-09-18 12:30


起源


而这一个 w3schools.com/sql/sql_alter.asp - Academy of Programmer


答案:


句法:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

例:

ALTER TABLE SomeTable
        ADD SomeCol Bit NULL --Or NOT NULL.
 CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is autogenerated.
    DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

笔记:

可选约束名称:
如果你遗漏了 CONSTRAINT D_SomeTable_SomeCol 然后SQL Server将自动生成
一个有趣的名字的默认约束,如: DF__SomeTa__SomeC__4FB7FEF6

可选的With-Values声明:
WITH VALUES 只有在Column可以为Nullable时才需要
并且您想要用于现有记录的默认值。
如果你的专栏是 NOT NULL,然后它会自动使用默认值
对于所有现有记录,无论您是否指定 WITH VALUES 或不。

插件如何使用默认约束:
如果您将记录插入 SomeTable 并做  指定 SomeCol的价值,那么它将默认为 0
如果插入记录  指定 SomeCol的价值 NULL (并且您的列允许空值),
那么Default-Constraint会  使用和 NULL 将作为值插入。

笔记基于以下每个人的好评。
特别感谢:
@Yatrix,@ WalterStabosz,@ YahooSerious和@StackMan的评论。


2920
2017-09-18 12:34



请记住,如果列可以为空,则null将是用于现有行的值。 - Richard Collette
@Thecrocodilehunter Nullable列意味着您可以为列值插入Null。如果它不是可空列,则必须插入该数据类型的某些值。因此,对于现有记录,Null将插入其中并在新记录中,除非另有说明,否则将插入默认值。合理? - Yatrix
我喜欢这个答案比dbugger好一点,因为它明确地命名了默认约束。仍使用dbugger的语法创建默认约束,但其名称是自动生成的。在编写DROP-CREATE脚本时,了解确切的名称非常方便。 - Walter Stabosz
@Vertigo只有列是真的 NOT NULL。请试试这个: create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah; 您将看到列的2个NULL值 b。 - ErikE
使用 WITH VALUES 更新现有的可空行。看到 MSDN:“如果添加的列允许空值和 WITH VALUES 如果指定,则默认值存储在新列中,并添加到现有行中。“ - Yahoo Serious


ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

包含了 默认 填写列 现有 具有默认值的行,因此不违反NOT NULL约束。


869
2017-09-18 12:31



该答案的问题是默认值仅对新记录有效。现有记录仍将具有NULL值。 - Roee Gavirel
你会发现事实并非如此。否则将违反约束。 - dbugger
现有行中的列将使用默认值填充。一点点的实证检验就可以证明这一点。 - dbugger
只是为了澄清 - 如果命令中省略了“NOT NULL”,则现有行的值将不会更新并保持为NULL。如果命令中包含“NOT NULL”,则将更新现有行的值以匹配默认值。 - Stack Man
对于多列 ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT(1),col_2 int NULL - aads


添加时 可空栏目WITH VALUES 将确保将特定的DEFAULT值应用于现有行:

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

196
2018-04-12 17:40



这是一个关键点。很容易假设一个列有一个 DEFAULT 约束总是有一个值 - 即使不是NULL NOT NULL 未指定。 - Bill Brinkley
@tkocmathla呃,我不是在谈论 BIT 数据类型,我在谈论这个特殊的 BIT  柱。看看答案,列被声明为 NOT NULL。 - rsenna


ALTER TABLE <table name> 
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name> 
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO

115
2017-09-18 12:39



如果表已有内容,则此操作无效,因为在默认值约束之前创建了新的“不可为空”列 - WDuffy
我的+1代表第一个后面的片段 GO 这会向现有列添加约束。 - Barry Guvenkaya


ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

104
2017-08-05 03:28



这个添加null!之前必须不为null - baaroz
@baaroz,这适用于NOT NULL:ALTER TABLE MYTABLE添加MYNEWCOLUMN VARCHAR(200)NOT NULL默认'SNUGGLES' - stom


当你添加的列有一个时,请注意 NOT NULL 约束,但没有 DEFAULT 约束(值)。该 ALTER TABLE 如果表中有任何行,则该语句将失败。解决方案是删除 NOT NULL 来自新列的约束,或提供一个 DEFAULT 对它的约束。


84
2017-09-24 16:03



任何 SQL示例 关于它 ? - Kiquenet


最基本的版本只有两行

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

78
2018-05-25 14:50