如果没有DEFAULT值,我可以添加一个不为空的列吗?

我可以添加一个我指定为NOT NULL的列,我不想指定DEFAULT值,但MS-SQL 2005说:

ALTER TABLE只允许添加可以包含空值的列,或者指定一个DEFAULT定义,或者添加的列是一个标识或时间戳列,或者如果前面的条件都不满足,表必须是空的以允许添加这一列。 列'test'不能被添加到非空表'shiplist',因为它不能满足这些条件。

如果是,请让我知道语法,如果否,请说明原因。

不,你不能。

因为如果可以的话,SQL将不知道应该把什么东西放在已经存在的logging中。 如果您在表格中没有任何logging,则无任何问题。

最简单的方法是使用默认值创build列,然后删除默认值。

ALTER TABLE dbo.MyTable ADD MyColumn text NOT NULL CONSTRAINT DF_MyTable_MyColumn DEFAULT 'defaultValue' ALTER TABLE dbo.MyTable DROP CONSTRAINT DF_MyTable_MyColumn 

另一种方法是添加没有约束的列,填充所有单元格的值并添加约束。

将列添加到表中,更新现有的行,使它们都不为空,然后添加一个“非空”约束。

否 – SQL Server相当合理地拒绝这个,因为它不知道现有的行应该有什么值

同时创build一个DEFAULT很容易,然后立即删除它。

你不能。 但是可以考虑将默认值指定为('')

没有。

只需使用空string'' (在字符types的情况下)或0(如果数字)等作为默认值

不,您不能像SQL Server或任何其他数据库引擎那样强制将此新列置于数据表中的现有行为空。 但是由于你不允许NULL,所以你需要提供一个默认值来尊重你自己的约束。 这很有意义! DBE不会外推现有行的非空值的值。

@ Damien_The_Unbeliever的评论 ,是否增加了计算列? 这个问题和答案都不是这个意思。 在计算列的情况下,错误状态:

“只有UNIQUE或PRIMARY KEY约束可以在计算列上创build,而CHECK,FOREIGN KEY和NOT NULL约束要求保留计算列”

好的,如果继续这个猜谜游戏,这里是我的脚本说明在一个“ALTER TABLE”步骤中添加“NOT NULL”列:

 CREATE TABLE TestInsertComputedColumn ( FirstName VARCHAR(100), LastName CHAR(50) ); insert into TestInsertComputedColumn(FirstName,LastName) select 'v', 'gv8'; select * from TestInsertComputedColumn; ALTER TABLE TestInsertComputedColumn ADD FullName As FirstName + LastName PERSISTED NOT NULL; select * from TestInsertComputedColumn; --drop TABLE TestInsertComputedColumn; 

我使用这种方法插入NOT NULL列没有默认值

 ALTER TABLE [Table] ADD [Column] INT NULL GO UPDATE [Table] SET [Column] = <default_value> ALTER TABLE [Table] ALTER COLUMN [Column] INT NOT NULL