如果我有两个表和第三个表,它是第一个和第二个表的外键,如下所示:
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 个表中删除一个条目,并让另一个带有外键的表删除其条目,但我不确定如何删除另一个也引用该表的表,该表也使用外键引用该表只有 1 个查询。
使用外键无法实现您想要实现的目标,至少不是您设置它的方式。
表 C
在 A
上有一个外键,因此如果删除了 A
中的相应键,则C
中的条目将被删除,而不是相反。如果要在删除C
中的条目时从A
中删除,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"