2017-06-19 23 views

回答

2

我觉得documentation是相当清楚的:

SET/DROP NOT NULL

这些形式改变一个列是否标记为允许空值或 拒绝空值。当列 不包含空值时,只能使用SET NOT NULL。

所以,使用这种形式,你不能在没有检查以前的值的情况下添加这样的约束。

如果使用add table_constraint,那么你可以使用CHECK cosntraint做同样的事情:

ADD table_constraint [NOT VALID]

这种形式增加了使用相同的语法一个新的约束,表作为 CREATE TABLE,加上选项NOT VALID,目前只有 允许使用外键和CHECK约束。如果约束条件为 ,则标记为“无效”,则会跳过可能较长的初始检查以验证表中所有行满足约束条件。对于后续插入或 更新(即,除非 引用表中存在匹配的行(如果是外键),它们将失败,并且它们将失败,除非 新行匹配指定的检查约束)。但数据库 不会假定该约束对于表中的所有行都成立, 直到通过使用VALIDATE CONSTRAINT选项进行验证。

因此,您不能使用alter table添加NOT NULL约束。你可以使用CHECK做基本相同的事情。然后,您使用NOT VALID旁路检查。否则,检查发生。