我已经建了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文档。
答案 0 :(得分:1)
对于第一个问题,表中可能存在数据问题。子表中可能存在父表中不存在的值。
像这样检查:
SELECT formId FROM items WHERE formId NOT IN (SELECT id FROM forms)
对于第二个错误,您可以尝试将formId
作为items
表中的主键。