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。
这个补丁对数据库操作效率有什么影响?
这个补丁提高了数据库操作效率,因为它允许在不长时间锁定表的情况下添加约束,减少了对并发操作的影响。
➡️