我们假设我有一个表Clients(ID,Name,Phone)
,里面有几行,其中一些在«Phone»列中是空的。在postgresql中添加新约束会检查之前添加的行吗?
如果我决定在«Phone»列中的表中添加一个新的NOT NULL
约束,PostgreSQL是否会检查已经在表中的行,还是只对在约束之后添加的行起作用宣言 ?
我们假设我有一个表Clients(ID,Name,Phone)
,里面有几行,其中一些在«Phone»列中是空的。在postgresql中添加新约束会检查之前添加的行吗?
如果我决定在«Phone»列中的表中添加一个新的NOT NULL
约束,PostgreSQL是否会检查已经在表中的行,还是只对在约束之后添加的行起作用宣言 ?
我觉得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
旁路检查。否则,检查发生。