【发布时间】:2017-01-26 13:28:38
【问题描述】:
是否可以进行 XOR CHECK CONSTRAINT?
我正在我刚刚制作的名为 test 的测试表上执行此操作,并且有 3 列:
- id,大整数
- a, bigint
- b,大整数
我为此做了一个检查约束:
(a IS NOT NULL AND b = NULL) OR (b IS NOT NULL AND a = NULL)
Which apparently would work in MSSQL
我通过这样做测试了它:
INSERT INTO public.test(
id, a, b)
VALUES (1, 1, 1);
这应该失败,因为它在 OR 的任一侧都不会评估为 TRUE。 但是,它插入得很好。
当我查看 postgres 实际存储为约束时,我得到了:
(a IS NOT NULL AND b = NULL::bigint OR b IS NOT NULL AND a = NULL::bigint)
我听说 AND 优先于 OR,所以即使这仍然有效。
有人对此有解决方案吗?最好是三列或更多列也可以的?我知道这些可能会更复杂。
编辑:改变
= NULL
到
IS NULL
给我:
ERROR: cannot cast type boolean to bigint
【问题讨论】:
-
我是
IS NULL。 -
@jarlh “错误:不能将 boolean 类型转换为 bigint”,如果我这样做的话。
-
似乎您正在(尝试)在这里使用一些 Postgresql 特定的 SQL(我不知道。)
-
@Blanen:你是说
a IS NOT NULL是允许的,而a IS NULL会抛出错误?那不太可能。请显示您的完整检查约束 -
@ThorstenKettner 是的,你是对的。我猜只是 pgAdmin4 很奇怪。
标签: sql postgresql constraints xor