我想知道如何解决这个问题。
我有两张桌子
Table1 ( t1_prim ,t1_int),以t1_prim为主键,t1_int null。
Table2 ( t2_prim1 ,t2prim2,t2_int),以t2_prim1和t2_prim2作为主密钥,外键约束t2_prim1引用t1_prim。
如何定义约束,以确保没有人在t2_int中输入大于t1_int中相应条目的整数?
我尝试过这样做(由于无法在check约束中输入子查询,所以无法工作):
CREATE TABLE table2
(t2_prim1 TEXT,
t2_prim2 INTEGER,
t2_int INTEGER NOT NULL,
PRIMARY KEY (t2_prim1, t2_prim2),
FOREIGN KEY (t2_prim1) REFERENCES table1(t1_prim),
CHECK (t2_int2 <= (SELECT t1_int2 FROM table1 WHERE t1_int1=t2_int1)));我认为如果它能像这样工作的话,还有另外一个问题。如何检查,当更改t1_int时,该约束是否已完全填充?
发布于 2011-10-29 14:42:37
终于找到了我问题的答案。您可以通过使用触发器来解决问题。下面是一个有用的例子:
CREATE TABLE table1
(t1_prim TEXT PRIMARY KEY,
t1_int INTEGER NOT NULL);
CREATE TABLE table2
(t2_prim1 TEXT,
t2_prim2 INTEGER,
t2_int INTEGER NOT NULL,
PRIMARY KEY (t2_prim1, t2_prim2),
FOREIGN KEY (t2_prim1) REFERENCES table1(t1_prim));创建用于更新和插入的触发器:
CREATE TRIGGER t1_int_update_constraint
BEFORE UPDATE OF t1_int ON table1
BEGIN
SELECT CASE
WHEN new.t1_int < (SELECT max(t2_int) FROM table2 WHERE t2_prim1=old.t1_prim)
THEN (SELECT RAISE(ABORT,
'Input smaller than maximum of all values for t2_int in database!'))
END;
END;
CREATE TRIGGER t2_int_update_constraint
BEFORE UPDATE OF t2_int ON table2
BEGIN
SELECT CASE
WHEN new.t2_int > (SELECT t1_int FROM table1 WHERE t1_prim=old.t2_prim1)
THEN (SELECT RAISE(ABORT,
'Input bigger than value in t1_int!'))
END;
END;
CREATE TRIGGER t2_int_insert_constraint
BEFORE INSERT ON table2
BEGIN
SELECT CASE
WHEN new.t2_int > (SELECT t1_int FROM table1 WHERE t1_prim=new.t2_prim1)
THEN (SELECT RAISE(ABORT,
'Input bigger than value in t1_int!'))
END;
END;如果现在有以下表格:
table1
t1_prim t1_int
---------- ----------
one 5
two 10 table2
t2_prim1 t2_prim2 t2_int
---------- ---------- ----------
one 1 5
one 2 4
two 1 7
two 2 5
two 3 1 你可以得到这个输出:
UPDATE table1 SET t1_int=4 WHERE t1_prim='one';错误:在数据库中输入t2_int的所有值小于最大值!
UPDATE table1 SET t1_int=6 WHERE t1_prim='two';错误:在数据库中输入t2_int的所有值小于最大值!
UPDATE table2 SET t2_int=8 WHERE t2_prim1='one' AND t2_prim2=1;错误:在t1_int中输入大于值!
UPDATE table2 SET t2_int=11 WHERE t2_prim1='two' AND t2_prim2=2;错误:在t1_int中输入大于值!
INSERT INTO table2 VALUES ('one', 3, 6);错误:在t1_int中输入大于值!
虽然这些方法运作得很好:
INSERT INTO table2 VALUES ('one', 3, 6);
UPDATE table2 SET t2_int=1 WHERE t2_prim1='one' AND t2_prim2=1;
UPDATE table1 SET t1_int=8 WHERE t1_prim='two';https://stackoverflow.com/questions/7866686
复制相似问题