我可以在没有DEFAULT值的情况下添加非空列

Sau*_*gya 64 sql t-sql sql-server sql-server-2005

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

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

如果是,请告诉我语法,如果不,请说明原因.

Gim*_*mly 81

不,你不能.

因为如果可以的话,SQL不知道在现有记录中将什么作为值.如果表中没有任何记录,那么它可以正常工作.

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

ALTER TABLE dbo.MyTable ADD
MyColumn text NOT NULL CONSTRAINT DF_MyTable_MyColumn DEFAULT 'defaultValue'
ALTER TABLE dbo.MyTable
DROP CONSTRAINT DF_MyTable_MyColumn
Run Code Online (Sandbox Code Playgroud)

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


Pau*_*lin 19

将列添加到表中,更新现有行,使它们都不为null,然后添加"not null"约束.

  • 如果新值的逻辑比简单常量更复杂,那么这是比创建/删除默认值更好的解决方案. (4认同)
  • 为什么或如何更新(手动?)+更改为“非空”,而不是通过默认值自动“更新”+更改为“无默认值”(删除默认值)可能更好? (3认同)

sad*_*bot 10

我使用这种方法插入没有默认值的 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
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 8

否 - SQL Server非常合理地拒绝这一点,因为它不知道现有行应该具有什么值

同时创建DEFAULT很容易,然后立即删除它.