多行上的sqlite检查约束
如果我有桌子:多行上的sqlite检查约束,sqlite,Sqlite,如果我有桌子: CREATE TABLE foo (a INTEGER, b INTEGER, c INTEGER, PRIMARY KEY (a, b)); 我是否可以强制执行列约束,其中对于所有具有相同值的a(1)而言,c最多可以不为NULL一次。例如: a b c __________ 1 2 NULL 1 3 NULL 1 4 1 1 5 NULL 2 4 1 2 5 NULL 这是允许的,因为对于所有1的a,只有一个非空c。然而: a b c ___
CREATE TABLE foo (a INTEGER, b INTEGER, c INTEGER, PRIMARY KEY (a, b));
我是否可以强制执行列约束,其中对于所有具有相同值的a
(1
)而言,c
最多可以不为NULL
一次。例如:
a b c
__________
1 2 NULL
1 3 NULL
1 4 1
1 5 NULL
2 4 1
2 5 NULL
这是允许的,因为对于所有1
的a
,只有一个非空c
。然而:
a b c
__________
1 2 2
1 3 NULL
1 4 1
1 5 NULL
2 4 1
2 5 NULL
不允许,因为对于1
的a
,在c
中有两个notnull
值
我已经阅读了CHECK
的文档,但我不确定如何在SQLite中表达这一点,或者如果可以表达这一点…要检查其他行,您需要一个子查询。报告说:
检查约束的表达式不能包含子查询
您可以通过以下方式完成此操作:
(还有一个类似的更新触发器。)
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;