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 约束的功能,显著提高了数据库操作的效率。通过减少长时间的独占锁定,用户可以在进行约束验证时,继续执行其他操作,这对于高并发环境尤为重要。

约束验证的灵活性

新语法允许用户在添加约束时使用命名约束,这样可以避免语法错误并提高可读性。虽然添加约束时仍需 ACCESS EXCLUSIVE 锁,但验证过程所需的锁较轻,允许更多的并行操作,提升了整体性能。

注意约束状态

尽管可以添加无效的 NOT NULL 约束,但在查询时需要注意约束的状态。用户应定期检查 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。

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

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

🏷️

标签

➡️

继续阅读