如果我有两个表和第三个表,它是第一个和第二个表的外键,如下所示:
CREATE TABLE A
(
name VARCHAR(255),
PRIMARY KEY(name)
);
CREATE TABLE B
(
number INT,
PRIMARY KEY(number)
);
CREATE TABLE C
(
cname VARCHAR(255),
cnumber INT,
PRIMARY KEY(cname, cnumber),
FOREIGN KEY(cname) REFERENCES A(name) ON DELETE CASCADE,
FOREIGN KEY(cnumber) REFERENCES B(number) ON DELETE CASCADE
);
INSERT INTO A values("John");
INSERT INTO A values("Sam");
INSERT INTO B values(1);
INSERT INTO B values(2);
INSERT INTO C values("John", 1);
INSERT INTO C values("John", 2);
INSERT INTO C values("Sam", 2);
我想删除1
,以便从B中删除(1)
,同时从C中删除条目(John,1)
,同时删除A中的(John)
因为DELETE CASCADE
我应该能够做到,但是:
DELETE FROM B WHERE number = 1;
仅从B中删除1
,从C中删除(John,1)
,但不删除A中的(John)
。
到目前为止,我只能从1个表中删除一个条目,并让另一个表用外键删除它的条目,但我不知道如何删除另一个同时使用外键引用该表的表只有JUST 1查询。
答案 0 :(得分:2)
使用外键无法实现您的目标,至少不是您设置的方式。
表C
在A
上有一个外键,因此如果C
中的相应键被删除,则A
中的条目将被删除,而不是相反。
如果您要删除A
中C
中的条目,A
需要在C
上设置外键。
但是 这需要cname
是C
中的唯一键。 Sqlite允许您设置和插入数据,但如果有多个条目被引用为外键,它将不允许您删除。
PRAGMA foreign_key = true;
CREATE TABLE B
(
number INT,
PRIMARY KEY(number)
);
CREATE TABLE C
(
cname VARCHAR(255),
cnumber INT,
PRIMARY KEY(cname, cnumber),
FOREIGN KEY(cnumber) REFERENCES B(number) ON DELETE CASCADE
);
CREATE TABLE A
(
name VARCHAR(255),
PRIMARY KEY(name)
FOREIGN KEY(name) REFERENCES C(came) ON DELETE CASCADE
);
INSERT INTO B values(1);
INSERT INTO B values(2);
INSERT INTO C values("John", 1);
INSERT INTO C values("John", 2);
INSERT INTO C values("Sam", 2);
INSERT INTO A values("John");
INSERT INTO A values("Sam");
INSERT INTO C values("John", 1);
INSERT INTO C values("John", 2);
INSERT INTO C values("Sam", 2);
DELETE FROM B where number = 1;
Error: foreign key mismatch - "A" referencing "C"