SQLite 在删除级联与两个外键



如果我有两个表和第三个表,它是第一个和第二个表的外键,如下所示:

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 个查询。

使用外键无法实现您想要实现的目标,至少不是您设置它的方式。

CA 上有一个外键,因此如果删除了 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"

最新更新