为什么我的外键不匹配?

时间:2018-03-22 10:24:49

标签: sql sqlite foreign-keys

我无法弄清楚为什么我的外键与下面的sqlite不匹配:

PRAGMA foreign_keys=ON;

CREATE TABLE a (
    id INT NOT NULL,
    PRIMARY KEY (id));

CREATE TABLE b (
    a_id INT NOT NULL,
    id INT NOT NULL,
    PRIMARY KEY (a_id, id),
    FOREIGN KEY (a_id) REFERENCES a(id));

CREATE TABLE c (
    b_id INT NOT NULL,
    id INT NOT NULL,
    PRIMARY KEY (b_id, id),
    FOREIGN KEY (b_id) REFERENCES b(id));

insert into a VALUES (1);
insert into b VALUES (1, 2);
insert into c VALUES (2, 3);

最后一行导致:

Error: foreign key mismatch - "c" referencing "b"

我做错了什么?

3 个答案:

答案 0 :(得分:1)

b的定义是:

CREATE TABLE b (
    a_id INT NOT NULL,
    id INT NOT NULL,
    **PRIMARY KEY (a_id, id),**
    FOREIGN KEY (a_id) REFERENCES a(id)
);

您已定义复合主键。也就是说,主键中包含多个列。任何引用都需要使用定义的所有键。因此,您需要a_id作为参考:

CREATE TABLE c (
    b_id INT NOT NULL,
    id INT NOT NULL,
    a_id INT,
    PRIMARY KEY (b_id, id),
    FOREIGN KEY (a_id, b_id) REFERENCES b(a_id, id)
);

这是我发现复合主键很麻烦的原因之一。您可以为任何表定义合成主键 - 基本上是自动递增的列。这适用于外键引用。

答案 1 :(得分:1)

复合主键是由多个列组成的主键。 在表b中,您有复合主键b_id, id,因此您必须同时使用它们。您可以通过示例了解复合主键:https://beginnersbook.com/2015/04/composite-key-in-dbms/

CREATE TABLE c (
    b_id INT NOT NULL,
    id INT NOT NULL,
    PRIMARY KEY (b_id, id),
    FOREIGN KEY (b_id) REFERENCES b(a_id, id))

答案 2 :(得分:1)

b表的PK为a_id + id因此,您的c表的FK不仅必须引用b(id),还必须引用b(a_id)。 我建议你不要在表格中使用复合主键。