这就是我想要做的:
我有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`);
如您所见,表parent具有自动递增的主键“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),它的事变道理!但那不是办理方案.
假如子表中没有相干的行,我没有看到插入阻塞的效用…
我只是想做一对多的相关……
(我知道我可以行使JOIN,但我正在实行行使表相关,数据完备性以及PHP的元数据)
最佳谜底
看起来你反过来引用表和引用表.你也许想做:
ALTER TABLE `child ` ADD FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`);
您还可以在CREATE TABLE语句中界说外键,如下所示:
CREATE TABLE `parent` (
`id` int(11) NOT NULL AUTO_INCREMENT,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,`related_ids`) VALUES (2,`related_ids`) VALUES (3,100);
ERROR 1452 (23000): Cannot add or update a child row:
a foreign key constraint fails
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|