站长网 MySql教程 mysql – 如何使用自动递增的主键作为外键?

mysql – 如何使用自动递增的主键作为外键?

这就是我想要做的: 我有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,`rela

这就是我想要做的:

我有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 

本文来自网络,不代表站长网立场,转载请注明出处:https://www.zwzz.com.cn/html/jc/mysql/2021/0524/5249.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部