我可以添加没有默认值的非空列吗


72

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

ALTER TABLE仅允许添加可以包含空值或指定DEFAULT定义的列,或者要添加的列是Identity或timestamp列,或者如果不满足任何先前条件,则该表必须为空才能允许添加本专栏的内容。无法将列“ test”添加到非空表“ shiplist”中,因为它不满足这些条件。

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


我认为这样做的重点是可以将列添加为“ NOT NULL”,但可以指定现有列的值,而不必做任何可爱的事情(例如创建约束然后将其删除)。对于我来说,想要拥有NOT NULL(无默认值),似乎很合理,而只需指定现有行的值即可。
Bunggo

Answers:


96

不,你不能。

因为如果可能的话,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

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


20

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


4
如果新值的逻辑比简单常量更复杂,则此方法比创建/删除默认值更好。
Damien_The_Unbeliever

2
为什么或如何更好地更新(手动?)+更改为“不为null,而不是通过默认值自动更新” +更改为“无默认值”(取消默认值)?
Gennady VaninГеннадийВанин

@ vgv8-如果每行中的新值依赖于该行中已存在的其他列怎么办?您无法通过默认约束来表达这一点。
Damien_The_Unbeliever

@Damien_The_Unbeliever,请参阅我的回复stackoverflow.com/questions/3997966/…。我必须提供一个am answer变体,以获取进行更好格式化的理由
Gennady VaninГеннадийВанин2010

要了解如何添加“非空”约束,请查看stackoverflow.com/a/689766/138757
Phil

8

否-SQL Server相当合理地拒绝了此操作,因为 它不知道现有行应具有的值

同时创建默认值,然后立即将其删除很容易。


3

我使用这种方法插入没有默认值的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

1

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


0

没有。

只需使用空字符串''(如果是字符类型)或0(如果是数字)等作为默认值


0

不,您不能这样做,因为SQL Server或任何其他数据库引擎将强制将新列对数据表中的现有行设置为null。但是由于不允许NULL,因此需要提供默认值才能遵守您自己的约束。这很有意义!DBE不会为现有行的非空值推断一个值。


尽管您说的确实有道理,但至少有一个“数据库引擎”是MS Access并非如此,它允许在NOT NULL不指定a的情况下将列添加到表中DEFAULT,其结果是NOT NULL列中的空值。我将提供证据作为答案……
一天,2012年

0

@ Damien_The_Unbeliever的评论,是否添加了计算列?问题和答案都没有暗示这样的意思。如果是计算列,则错误状态为:

“只能在计算列上创建UNIQUE或PRIMARY KEY约束,而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;

0

我使用下面的方法对我有用

Syntax:
ALTER TABLE <YourTable> ADD <NewColumn> <NewColumnType> NOT NULL DEFAULT <DefaultValue>

Example:
ALTER TABLE Tablename ADD ColumnName datetime NOT NULL DEFAULT GETDATE();

0

作为一种选择,您可以首先创建Null-able列,然后使用有效的not null值更新表列,最后使用ALTER列设置NOT NULL约束:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.