postgresql - 更改 Postgres 域的检查约束
问题描述
给定一个现有的DOMAIN
带有CHECK
约束的 Postgres:
CREATE DOMAIN code as CHAR(1)
CHECK (value IN ('A', 'B', 'C'));
我需要更改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
这种方法可能存在问题,还是有更好的方法?
解决方案
理论上,并发会话可能会在域没有约束时插入违反约束的行。颠倒命令的顺序将防止这种可能性。由于新约束是旧约束的超集,您可以使用域禁止检查现有列中的值:
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;
根据文档:
总是针对所有约束检查新插入或更新的行,即使是那些标记为 NOT VALID 的。
推荐阅读
- google-cloud-platform - 使用 terraform 在 GCP 作曲家中因运行状况检查错误而失败
- java - 如何减小合并后的 pdf 大小并加快与 PDFBox 的合并操作?
- ssl-certificate - aws 如何为路由 53 托管域设置云端分发的 ssl 证书?
- vue.js - 当孙文件发送成功的 PUT 请求时如何更新 vue 中的道具
- mysql - 为什么 Laravel 在 DB::listen 之后重定向到错误的 id?
- php - 如何将一个雄辩的结果变成一个数组 Laravel
- windows-installer - 如何在 NSIS 中同时显示两个自定义页面(某些 exe 和进度条的静默安装)
- ruby-on-rails - 禁止密码与账户 ID 或用户 ID 相同 [Ruby on Rails]
- matplotlib - 幻灯片更新后的 Matplotlib fill_between 不会重绘
- material-ui - 锚元素外部化到另一个组件时弹出菜单位置不正确