相关疑难解决方法(0)

Postgres:SET NOT NULL 如何比 CHECK 约束“更有效”

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)

postgresql check-constraints postgresql-9.5

22
推荐指数
1
解决办法
2315
查看次数

在没有表扫描的情况下向大表添加 NOT NULL 约束

尝试向NOT NULL具有 10 亿行的表添加约束。我无法承受超过几秒钟的表锁。有没有办法在alter table 语句期间防止全表扫描?我在列上创建了一个索引,希望它能被使用,但这似乎不起作用。可能是检查约束?其他选择?谢谢!

postgresql alter-table postgresql-9.3

14
推荐指数
2
解决办法
5613
查看次数