尝试更改表以添加外键时出错

时间:2014-08-22 17:14:17

标签: mysql sql

我已经建了2张桌子。形式和项目。

| forms | CREATE TABLE `forms` (
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`formName` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`dueDate` date DEFAULT '0000-00-00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

项目:

| items | CREATE TABLE `items` (
`formId` bigint(10) NOT NULL DEFAULT '0',
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`itemName` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', 
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

表单是父项,项目是子项。

我正在尝试更改表以添加外键,这样如果要删除forms.id,那么带有formId = forms.id的项中的项也会被删除。

我的问题是我无法做任何工作,我做错了什么?

ALTER TABLE items ADD CONSTRAINT FOREIGN KEY (formId) REFERENCES forms(id) ON DELETE CASCADE;
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`server_newTeamSales`.`#sql-64e0_28020de`, CONSTRAINT `#sql-64e0_28020de_ibfk_1` FOREIGN KEY (`formId`) REFERENCES `forms` (`id`) ON DELETE CASCADE)

ALTER TABLE forms ADD CONSTRAINT FOREIGN KEY (id) REFERENCES items(formId) ON DELETE CASCADE;
ERROR 1005 (HY000): Can't create table 'server_newTeamSales.#sql-64e0_28020de' (errno: 150)

我甚至不确定哪个表需要密钥,外键对我来说是新的,我无法理解开发站点上的mysql文档。

1 个答案:

答案 0 :(得分:1)

对于第一个问题,表中可能存在数据问题。子表中可能存在父表中不存在的值。

像这样检查:

SELECT formId FROM items WHERE formId NOT IN (SELECT id FROM forms)

对于第二个错误,您可以尝试将formId作为items表中的主键。