给定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)
这种方法可能存在问题,还是有更好的方法?
理论上,在域没有约束的时刻,并发会话可能会插入违反约束的行。颠倒命令的顺序将防止这种可能性。由于新约束是旧约束的超集,您可以使用域禁止检查现有列中的值:
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 的约束。
| 归档时间: |
|
| 查看次数: |
583 次 |
| 最近记录: |