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

时间:2010-08-23 02:13:31

标签: 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";

它失败了,错误:

  

无法添加或更新子行:a   外键约束失败   (myschemaparent,CONSTRAINT   parent_ibfk_1外键(id)   参考childparent_id))

我知道它失败了,因为它没有在子表中找到引用的记录。如果我开始在子表中创建一个记录,将它的parent_id设置为1,然后重置父表的自动增量计数器(以便下一个插入将具有id = 1),它的工作原理!但那不是解决方案。

如果子表中没有相关的行,我没有看到插入阻塞的效用...

我只是想做一对多的关系......

(我知道我可以使用JOIN,但我正在尝试使用表关系,数据完整性以及PHP的元数据)

2 个答案:

答案 0 :(得分:9)

看起来您反向引用表和引用表。你可能想这样做:

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 

答案 1 :(得分:1)

呃......我想我倒退了。 我似乎需要将外键添加到子表中,如下所示:

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

我很难处理MySQL术语。你能怪我吗?