删除级联上的SQLite有两个外键

时间:2015-11-03 23:25:09

标签: sql 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个表中删除一个条目,并让另一个表用外键删除它的条目,但我不知道如何删除另一个同时使用外键引用该表的表只有JUST 1查询。

1 个答案:

答案 0 :(得分:2)

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

CA上有一个外键,因此如果C中的相应键被删除,则A中的条目将被删除,而不是相反。 如果您要删除AC中的条目,A需要在C上设置外键。

但是 这需要cnameC中的唯一键。 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"