不带括号打印检查约束
check constraint being printed without parenthesis
我有这个 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)
如果没有括号,会导致不需要的规则。这是打印 table 详细信息时的错误吗?在以更明确的方式记录这些规则的同时,是否有更简单的应用方法?
AND
绑定比 OR
强,所以两个版本是等效的。 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)
如果没有括号,会导致不需要的规则。这是打印 table 详细信息时的错误吗?在以更明确的方式记录这些规则的同时,是否有更简单的应用方法?
AND
绑定比 OR
强,所以两个版本是等效的。 PostgreSQL 不存储字符串,而是存储解析后的表达式。