Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多行上的sqlite检查约束_Sqlite - Fatal编程技术网

多行上的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;