在PostgreSQL docs for Constraints 中,它说
非空约束在功能上等同于创建检查约束
CHECK (column_name IS NOT NULL)
,但在 PostgreSQL 中创建显式非空约束更有效。
我很好奇
CHECK (column_name IS NOT NULL)
而不是有SET NOT NULL
什么危害?我希望能够添加一个NOT VALID
CHECK
约束并单独验证它(因此AccessExclusiveLock
仅在添加约束时保留一小段时间,然后ShareUpdateExclusiveLock
为更长的验证步骤保留a ):
ALTER TABLE table_name
ADD CONSTRAINT column_constraint
CHECK (column_name IS NOT NULL)
NOT VALID;
ALTER TABLE table_name
VALIDATE CONSTRAINT column_constraint;
Run Code Online (Sandbox Code Playgroud)
代替:
ALTER TABLE table_name
ALTER COLUMN column_name
SET NOT NULL;
Run Code Online (Sandbox Code Playgroud) 尝试向NOT NULL
具有 10 亿行的表添加约束。我无法承受超过几秒钟的表锁。有没有办法在alter table 语句期间防止全表扫描?我在列上创建了一个索引,希望它能被使用,但这似乎不起作用。可能是检查约束?其他选择?谢谢!