如果我有桌子:
CREATE TABLE foo (a INTEGER, b INTEGER, c INTEGER, PRIMARY KEY (a, b));
我是否可以强制执行列约束,其中所有a
具有相同的值(例如1
),c
最多可以NOT NULL
一次。例如:
a b c
__________
1 2 NULL
1 3 NULL
1 4 1
1 5 NULL
2 4 1
2 5 NULL
是允许的,因为对于a
的所有1
,只有一个NON NULL
c
。但是:
a b c
__________
1 2 2
1 3 NULL
1 4 1
1 5 NULL
2 4 1
2 5 NULL
不允许,因为NOT NULL
c
a
中有两个1
值。
我一直在阅读CHECK
的文档,但我不确定如何在SQLite中表达这一点,或者是否可以表达...
答案 0 :(得分:1)
要检查其他行,您需要一个子查询。 documentation说:
CHECK约束的表达式可能不包含子查询。
您可以使用trigger:
执行此操作CREATE TRIGGER check_one_c_insert
BEFORE INSERT ON foo
FOR EACH ROW
WHEN NEW.c IS NOT NULL
BEGIN
SELECT RAISE(FAIL, 'another row has non-NULL c')
FROM foo
WHERE a = NEW.a
AND b = NEW.b
AND c IS NOT NULL;
END;
(和UPDATE类似的触发器。)