最小锁的情况添加 not null 约束

当大表字段添加 not  null 时,直接执行 alter column_name set not null, 数据库对表加的是 ACCESS EXCLUSIVE LOCK 锁,会阻塞读写,同时全表扫描检查是否所有记录满足 not null 条件。当表比较小或是使用频率不高时,可以使用这种方式,当表比较大,同时低频时间不是很明显时,会比较麻烦。

这时可以使用添加 not null 约束的方式来解决:

ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (column IS NOT NULL) NOT VALID;
ALTER TABLE table_name VALIDATE CONSTRAINT constraint_name;

1、第一步是添加 not null 约束,但设置为 not valid 模式下,此时会跳过全表扫描,但仍然会后面的insert 和 update 有效,之所以设置约束为 not valid,因为直接添加约束添加的锁是 ACCESS EXCLUSIVE lock,会阻塞读写操作。
2、执行第二步是校验旧有记录是否满足约束条件。已存在的数据,我往往已经做了更新,这一步是执行全表扫描,一般都会执行成功。

原文地址:https://www.cnblogs.com/xiaotengyi/p/13273871.html