如何解决不带括号打印检查约束
我有这个 DDL:
CREATE TABLE checkout_value (
id BIGSERIAL PRIMARY KEY,start_value INTEGER,end_value INTEGER,);
考虑到电子商务,我想保存几个可能值的范围,以便在结账时应用未来的规则。示例:
- 价值 20 美元
- 价值 400 美元起
- 30 美元到 300 美元之间
这样,我想允许一个空值,但如果两者都不为空,start_value
应该小于 end_value
。
我虽然关于触发器,但我正在尝试使用检查约束来做到这一点,方式如下:
CREATE TABLE checkout_value (
id BIGSERIAL PRIMARY KEY,CHECK
(
(start_value IS NOT NULL AND end_value IS NULL)
OR
(start_value IS NULL AND end_value IS NOT NULL)
OR
(start_value IS NOT NULL AND end_value IS NOT NULL AND end_value > start_value)
)
);
这有效!但是当我运行 \d checkout_value
时,它打印时没有任何括号:
Check constraints:
"checkout_value_check" CHECK (start_value IS NOT NULL AND end_value IS NULL OR start_value IS NULL AND end_value IS NOT NULL OR start_value IS NOT NULL AND end_value IS NOT NULL AND end_value > start_value)
如果没有括号,将导致不需要的规则。这是打印表格细节的错误吗?在以更明确的方式记录这些规则的同时,是否有更简单的应用方法?
解决方法
AND
的绑定比 OR
强,所以两个版本是等价的。 PostgreSQL 不存储字符串,而是存储解析后的表达式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。