我无法弄清楚为什么我的外键与下面的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"
我做错了什么?
答案 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)
。
我建议你不要在表格中使用复合主键。