更改 Postgres 域上的检查约束

Dar*_*ght 2 postgresql

给定DOMAIN具有CHECK约束的现有 Postgres :

CREATE DOMAIN code as CHAR(1) 
CHECK (value IN ('A', 'B', 'C'));
Run Code Online (Sandbox Code Playgroud)

我需要改变CHECK约束添加D作为成员的有效集合A,B和C。

由于新约束是第一个约束的超集,因此先是DROP现有约束,然后再ADD是它似乎是可以接受的;IE:

ALTER DOMAIN code 
DROP CONSTRAINT code_check; -- constraint is implicitly named `code_check`

ALTER DOMAIN code 
ADD CONSTRAINT code_check 
CHECK (value IN ('A', 'B', 'C', 'D')); -- new constraint
Run Code Online (Sandbox Code Playgroud)

这种方法可能存在问题,还是有更好的方法?

kli*_*lin 8

理论上,在域没有约束的时刻,并发会话可能会插入违反约束的行。颠倒命令的顺序将防止这种可能性。由于新约束是旧约束的超集,您可以使用域禁止检查现有列中的值:

ALTER DOMAIN code 
ADD CONSTRAINT code_check_new 
CHECK (value IN ('A', 'B', 'C', 'D')) NOT VALID;

ALTER DOMAIN code 
DROP CONSTRAINT code_check;

-- if for some reason the constraint name is important:
ALTER DOMAIN code 
RENAME CONSTRAINT code_check_new TO code_check;
Run Code Online (Sandbox Code Playgroud)

根据文档:

新插入或更新的行总是针对所有约束进行检查,即使是那些标记为 NOT VALID 的约束。