【发布时间】:2022-01-06 15:40:16
【问题描述】:
我在 SQLite 中有以下两个表:
CREATE TABLE `Link` (
`link_id` integer NOT NULL,
`part_id` integer NOT NULL,
CONSTRAINT `link_pk` PRIMARY KEY(`link_id`,`part_id`)
);
CREATE TABLE `Main` (
`main_id` integer NOT NULL PRIMARY KEY AUTOINCREMENT,
`link_id` integer NOT NULL REFERENCES `Link`(`link_id`)
);
INSERT INTO `Link` (link_id, part_id) VALUES (1,10);
INSERT INTO `Link` (link_id, part_id) VALUES (1,11);
INSERT INTO `Link` (link_id, part_id) VALUES (1,12);
INSERT INTO `Link` (link_id, part_id) VALUES (2,15);
INSERT INTO `Main` (main_id, link_id) VALUES (1,1);
INSERT INTO `Main` (main_id, link_id) VALUES (2,1);
INSERT INTO `Main` (main_id, link_id) VALUES (3,2);
许多Main 行可能引用相同的链接ID,许多Link 行可能具有相同的链接ID,这样select * from Main natural join Link where main_id=1 将返回N 行,select * from Main where link_id=1 将返回K 行。 link id很重要,原始数据每个main有1个link id,每个link有N个part id。
使用上面的模式,由于外键约束 (foreign key mismatch - "Main" referencing "Link": INSERT INTO Main (main_id, link_id) VALUES (1,1);),我无法在 Main 中插入任何行,大概是因为 the composite key requirement。我可以通过删除外键约束来实现这一点,但是我显然错过了一个约束。反转密钥的方向也不起作用,因为如上所述,这是一个多对多的关系。有没有办法在 SQLite 中正确地对此进行建模,其约束条件是 Link 中的每个 link_id 至少存在一行 Main?
【问题讨论】:
-
哪些行不能插入?示例中的三行可以插入就好了。
-
你应该重新考虑你的设计。
link_id和part_id应该是 2 个不同表中的主键,您当前的表Link应该是这些表的连接表。然后你可以让Main的link_id引用第一个表的link_id。 -
@choroba 运行代码当前给了我:
foreign key mismatch - "Main" referencing "Link": INSERT INTO Main (main_id, link_id) VALUES (1,1); -
@forpas 你想把它扩展成答案吗?
标签: sql database sqlite referential-integrity