gpt4 book ai didi

SQLite:确保一个条目小于另一个作为约束

转载 作者:行者123 更新时间:2023-12-03 19:04:25 24 4
gpt4 key购买 nike

我想知道如何解决这个问题。

我有两张 table

表 1 ( t1_prim , t1_int)
以 t1_prim 作为主键且 t1_int 不为空。

表 2 ( t2_prim1 , t2prim2 , t2_int)
以 t2_prim1 和 t2_prim2 作为主键,外键约束 t2_prim1 引用 t1_prim。

如何定义一个约束以确保没有人在 t2_int 中输入大于 t1_int 中相应条目的整数?

我试过这样(不起作用,因为你不能在检查约束中输入子查询):

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 时该约束是否仍被满足?

最佳答案

终于找到了我的问题的答案。您可以通过使用触发器来解决问题。这是一个工作示例:

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;

如果您现在有以下表格:

表格1
t1_prim     t1_int
---------- ----------
one 5
two 10

表2
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';

关于SQLite:确保一个条目小于另一个作为约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7866686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com