mysql - 如何将自动递增的主键也用作外键?

标签 mysql foreign-keys constraints auto-increment database-relations

这就是我想要做的:

我有 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 (myschema.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,
  `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 

关于mysql - 如何将自动递增的主键也用作外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3544322/

相关文章:

php - Laravel 原始查询不返回结果

mysql - 如何保留多个MySQL实例

php - Mysql触发器中的多个IF不起作用

php - 从网站前端编辑 MYSQL 数据库中的信息。

mysql - 外键应自动创建一个新条目

MySQL 错误号 150 创建因不存在的外键而失败

MySQL 删除外键索引时抛出错误。

iOS 8 自动布局、VFL 和边距等于或大于

Swift - 屏幕外的容器 View

xcode - 圆形图像变成钻石而不是圆形 - Swift 3