【发布时间】:2020-01-31 22:22:06
【问题描述】:
例如,这个查询是否可行?
CREATE TABLE products (
name text,
price numeric not null,
CHECK (IF price > 0 THEN name IS NOT NULL ELSE name IS NULL END IF)
);
更新:
好像没有
这里https://rextester.com/l/postgresql_online_compiler
报错
Error(s), warning(s):
42601: syntax error at or near "price"
查看文档 https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-EXCLUDE 它说
目前,CHECK 表达式不能包含子查询,也不能引用当前行列以外的变量。可以引用系统列 tableoid,但不能引用任何其他系统列。
但是IF不是子查询,不明白为什么不起作用
更新 2:
CREATE TABLE products (
name text,
price numeric not null,
CHECK ((price > 0 AND name IS NOT NULL) OR (price <= 0 AND name IS NULL))
);
有效,但是以这种方式编写复杂的查询很乏味
【问题讨论】:
-
在您的具体情况下,
((price > 0) = (name IS NOT NULL))将是最简洁的方式,您可能希望选择 then 和 else 分支不相关的示例。
标签: postgresql ddl check-constraints