postgresql - 打印不带括号的检查约束
问题描述
我有这个 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,
start_value INTEGER,
end_value INTEGER,
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 不存储字符串,而是存储已解析的表达式。
推荐阅读
- c++ - 这不应该给出越界警告吗?
- android - FastAdapter 和 ConstraintLayout 的滚动问题:跳过 211 帧
- java - 编程语言(尤其是飞镖)中的死代码是什么意思?
- java - 线程“主”java.lang.RuntimeException 中的异常:无法启动 Selenium 会话:未找到
- python - Autokeras installation with Anaconda
- rust - 有没有办法创建 std::slice::Iter 的类型别名?
- python - Pandas to_datetime does not ignore already converted dates
- php - Cant Figure out how to Remove characters from Sting in PHP
- php - TranslatePress plugin throwing errors after site migration to the new server
- javascript - named class expressions returning different values