多行上的sqlite CHECK约束

时间:2015-10-07 06:18:40

标签: sqlite

如果我有桌子:

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中表达这一点,或者是否可以表达...

1 个答案:

答案 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类似的触发器。)