Hubert 'depesz' Lubaczewski:等待 PostgreSQL 18 - 允许以 NOT VALID 形式添加 NOT NULL 约束

💡 原文英文,约2000词,阅读约需7分钟。
📝

内容提要

2025年4月7日,Álvaro Herrera 提交补丁,允许以 NOT VALID 形式添加 NOT NULL 约束,避免了长时间的独占锁定。ALTER TABLE 语句支持此功能,验证时只需轻微锁定,从而提高数据库操作效率。

🎯

关键要点

  • 2025年4月7日,Álvaro Herrera 提交补丁,允许以 NOT VALID 形式添加 NOT NULL 约束。
  • 此功能避免了长时间的独占锁定,提高了数据库操作效率。
  • ALTER TABLE 语句支持此功能,验证时只需轻微锁定。
  • 添加无效约束时仍需 ACCESS EXCLUSIVE 锁,但过程非常快速。
  • 验证约束时不需要重型锁,允许其他操作并行进行。
  • 新语法使用命名约束来添加 NOT NULL 约束,避免了语法错误。
  • 验证约束的过程中,保持的锁为 ShareUpdateExclusiveLock,允许正常的表访问。
  • 可以通过查询 pg_constraint 检查无效约束的状态。

延伸问答

什么是NOT VALID形式的NOT NULL约束?

NOT VALID形式的NOT NULL约束允许在不扫描表的情况下添加约束,之后再进行验证,避免长时间的独占锁定。

如何使用ALTER TABLE语句添加NOT NULL约束?

可以使用ALTER TABLE语句添加命名约束,例如:ALTER TABLE 表名 ADD CONSTRAINT 约束名 NOT NULL 列名 NOT VALID。

添加NOT NULL约束时需要什么样的锁?

添加NOT NULL约束时需要ACCESS EXCLUSIVE锁,但过程非常快速,验证时只需轻微锁定。

验证NOT NULL约束时会发生什么?

验证NOT NULL约束时,保持的锁为ShareUpdateExclusiveLock,允许正常的表访问,包括SELECT、INSERT、UPDATE和DELETE操作。

如何检查无效约束的状态?

可以通过查询pg_constraint来检查无效约束的状态,使用SQL语句SELECT * FROM pg_constraint WHERE NOT convalidated。

这个补丁对数据库操作效率有什么影响?

这个补丁提高了数据库操作效率,因为它允许在不长时间锁定表的情况下添加约束,减少了对并发操作的影响。

➡️

继续阅读