4

這就是我想要做的事:如何使用自動增加的主鍵作爲外鍵?

我有2個表...

CREATE TABLE `parent` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `data` text, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 

CREATE TABLE `child` (
    `parent_id` int(11) DEFAULT NULL, 
    `related_ids` int(11) DEFAULT NULL, 
    KEY `parent_id` (`parent_id`), 
    KEY `related_ids` (`related_ids`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

然後約束:

ALTER TABLE `parent` ADD FOREIGN KEY (`id`) REFERENCES `child` (`parent_id`); 

正如你可以看到父表具有一個自動遞增的主鍵「id」,它也被用作子表的外鍵。

現在我想在父表中插入一條記錄,像這樣:

INSERT INTO parent SET DATA="abc"; 

它失敗,錯誤:

Cannot add or update a child row: a foreign key constraint fails (anacorbero . parent , CONSTRAINT parent_ibfk_1 FOREIGN KEY (id) REFERENCES child (parent_id))

我所知,這是因爲它沒有找到失敗子表中的引用記錄。如果我通過在子表中創建一條記錄開始,將它的parent_id設置爲1,然後重置父表的自動遞增計數器(以便下一個插入將具有id = 1),它就可以工作!但這不是一個解決方案。

我沒有看到插入阻塞,如果沒有相關的行中的子表的工具...

我只是試圖做一個一對多的關係...

(我知道我可以使用加入,但我想用表關係,爲數據的完整性,也作爲PHP元)

回答

8

看起來你有引用和反向引用的表。你可能想要做的:

ALTER TABLE `child ` ADD FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`); 

您還可以定義在CREATE TABLE聲明外鍵,如下所示:

CREATE TABLE `parent` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `data` text, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 

CREATE TABLE `child` (
    `parent_id` int(11) DEFAULT NULL, 
    `related_ids` int(11) DEFAULT NULL, 
    KEY `parent_id` (`parent_id`), 
    KEY `related_ids` (`related_ids`), 
    FOREIGN KEY (`parent_id`) REFERENCES `parent`(`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

測試用例:

INSERT INTO parent (`data`) VALUES ('test data 1'); 
Query OK, 1 row affected (0.01 sec) 

INSERT INTO parent (`data`) VALUES ('test data 2'); 
Query OK, 1 row affected (0.01 sec) 

INSERT INTO child (`parent_id`, `related_ids`) VALUES (1, 100); 
Query OK, 1 row affected (0.01 sec) 

INSERT INTO child (`parent_id`, `related_ids`) VALUES (2, 100); 
Query OK, 1 row affected (0.01 sec) 

INSERT INTO child (`parent_id`, `related_ids`) VALUES (3, 100); 
ERROR 1452 (23000): Cannot add or update a child row: 
    a foreign key constraint fails 
+0

+1:當我讀到你的答案時,我意識到我誤讀了這個問題。 – 2010-08-23 02:23:32

+0

感謝您的快速回答。我只是意識到我自己! – Rolf 2010-08-23 02:26:41

+0

我已經在SQL Server 2012中定義了身份,但我試圖將一些值傳遞給db。所以在那個地方(自動遞增),我需要通過什麼? – 2013-12-11 15:24:11

1

呃......我我認爲我把它倒過來了。 看來,我需要外鍵添加到子表,這樣的:

ALTER TABLE `child` ADD FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`); 

我有一個很難對付的MySQL術語。你能怪我嗎?

+1

我很高興你意識到問題所在。如果你仔細想想,這並不難理解。外鍵是**約束**。並且你將在'child'表上添加約束,因爲'child'表的'parent'字段將被限制爲僅當該值存在於'parent'的'id'列時才接受值表。 – 2010-08-23 02:27:28