Answers:
作为选择,您可以首先创建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
另一个选择是为列指定正确的默认值:
ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'
UPD:请注意,GO
当您在Microsoft SQL Server上运行此代码时,必须包含上述答案。如果要在Oracle或MySQL上执行相同的操作,则需要使用如下分号;
:
ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;
update
您提到的危险声明在任何查询中都是有害的。它应该足够简单,以查看update
此处的语句中是否还有其他列。通常,您一次只能添加一两列。update
在本例中,如果您碰巧在语句中添加了一个不属于该列的额外列,那么也许您不应该首先负责数据。
ALTER COLUMN
SQLite不支持。
GO
,它似乎不是SQL规范的一部分,因此,可能会导致脚本无法通过支持它的工具之一执行而失败。只是使用分号?我不建议散布Microsoft标准,因为它们很少在乎任何已建立的合理标准,而要发明自己只是为了发明自己。除此之外,有用的答案。
其他SQL实现具有类似的限制。原因是添加一列需要为此列添加值(逻辑上,即使不是物理上),默认为NULL
。如果您不允许NULL
,并且没有default
,那么值将是多少?
由于SQL Server支持ADD CONSTRAINT
,因此我建议Pavel创建可为空的列,然后NOT NULL
在用非NULL
值填充约束之后添加约束的方法。