【问题标题】:error trying to alter tables to add foreign keys尝试更改表以添加外键时出错
【发布时间】:2014-10-16 14:54:46
【问题描述】:

我已经建了 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 是父项,items 是子项。

我正在尝试更改表以添加外键,这样如果 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][1]:stackoverflow.com/questions/16594672/…
  • 您的第一个语句应该有效。但是,在创建约束之前,似乎已经删除了一个或多个表单。您要么需要重新添加表单,要么删除不再与表单相关的项目(孤儿)。如果您可以只删除项目,请先执行此操作,然后添加约束Delete from items where formID not in (Select ID from forms)
  • 我清除了所有表单数据以及所有项目数据。现在使用哪一个,所以当我删除一个表单时,相关的项目也会被删除?

标签: mysql sql


【解决方案1】:

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

像这样检查:

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

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

【讨论】:

  • 我正在尝试在删除表单时删除项目。我应该使用第一个 alter 语句还是第二个?
  • @bart2puck:- 你可以试试第一个 alter 语句!
猜你喜欢
  • 1970-01-01
  • 2013-11-16
  • 2011-06-01
  • 2022-01-21
  • 2020-12-21
  • 1970-01-01
  • 2014-12-16
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多