我在 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。
使用上面的模式,Main由于外鍵約束 ( foreign key mismatch - "Main" referencing "Link": INSERT INTO Main (main_id, link_id) VALUES (1,1);) ,我無法插入任何行,大概是因為復合鍵要求。我可以通過洗掉外鍵約束來使其作業,但是我顯然缺少一個約束。反轉鍵的方向也不起作用,因為如上所述,這是一種多對多關系。有沒有一種方法可以在 SQLite 中正確建模,并限制Link每個link_idin中至少存在一行Main?
uj5u.com熱心網友回復:
我會提出一個不同的設計。
每2個物體link_id,并part_id應在2個表的主鍵,是這樣的:
CREATE TABLE Links (
link_id INTEGER PRIMARY KEY,
link_description TEXT
);
CREATE TABLE Parts (
part_id INTEGER PRIMARY KEY,
part_description TEXT
);
然后,創建上述表的連接表(如您當前的Link表):
CREATE TABLE Links_Parts (
link_id INTEGER NOT NULL REFERENCES Links(link_id),
part_id INTEGER NOT NULL REFERENCES Parts(part_id),
PRIMARY KEY(link_id, part_id)
);
和表Main:
CREATE TABLE Main (
main_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
link_id INTEGER NOT NULL REFERENCES Links(link_id)
);
所有的關系都在那里,如果你設定外鍵支持,你就可以保證參照完整性:
PRAGMA foreign_keys = ON;
查看一個簡化的演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/370839.html
