Hubert 'depesz' Lubaczewski:等待 PostgreSQL 18 - 允许以 NOT VALID 形式添加 NOT NULL 约束
内容提要
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。
这个补丁对数据库操作效率有什么影响?
这个补丁提高了数据库操作效率,因为它允许在不长时间锁定表的情况下添加约束,减少了对并发操作的影响。