我想创建一个数据库,其中表药物与表物品之间存在n x m关系,表格目标与表物品之间存在n x m关系。
我收到错误:Cannot delete or update a parent row: a foreign key constraint fails
我的代码需要更改什么?
DROP TABLE IF EXISTS `textmine`.`article`;
CREATE TABLE `textmine`.`article` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Pubmed ID',
`abstract` blob NOT NULL,
`authors` blob NOT NULL,
`journal` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `textmine`.`drugs`;
CREATE TABLE `textmine`.`drugs` (
`id` int(10) unsigned NOT NULL COMMENT 'This ID is taken from the biosemantics dictionary',
`primaryName` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `textmine`.`targets`;
CREATE TABLE `textmine`.`targets` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`primaryName` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `textmine`.`containstarget`;
CREATE TABLE `textmine`.`containstarget` (
`targetid` int(10) unsigned NOT NULL,
`articleid` int(10) unsigned NOT NULL,
KEY `target` (`targetid`),
KEY `article` (`articleid`),
CONSTRAINT `article` FOREIGN KEY (`articleid`) REFERENCES `article` (`id`),
CONSTRAINT `target` FOREIGN KEY (`targetid`) REFERENCES `targets` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `textmine`.`contiansdrug`;
CREATE TABLE `textmine`.`contiansdrug` (
`drugid` int(10) unsigned NOT NULL,
`articleid` int(10) unsigned NOT NULL,
KEY `drug` (`drugid`),
KEY `article` (`articleid`),
CONSTRAINT `article` FOREIGN KEY (`articleid`) REFERENCES `article` (`id`),
CONSTRAINT `drug` FOREIGN KEY (`drugid`) REFERENCES `drugs` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
答案 0 :(得分:1)
您正在尝试不按顺序创建表格。
例如,您正在尝试创建一个contiansdrug表,其中提到药物表之前的表药物。
请记住,任何SQL(甚至是DDL)都会尝试使数据库保持一致状态。
我建议按正确顺序放置命令。或者,您可以选择暂时关闭检查并在事务中运行创建脚本,请参阅说明here
相关部分是
SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;
.. your script..
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;
编辑:
好的,尽量不要为约束命名。阅读fine手册启发:
如果是CONSTRAINT符号子句 给定,符号值必须是唯一的 在数据库中。如果条款不是 给定,InnoDB创建名称 自动。
EDIT2:
要拼写出来,你有一个重复的约束符号article
,重命名它,一切都会好的。
标准做法是,如果您将约束命名为使用描述相关内容的名称,例如containsdrug_acticelid_article_id
(firsttablename_column_secondtablename_column)将是唯一且具有描述性的。
答案 1 :(得分:-2)
我解决了这个问题,没有在MySql中声明外键,只是将它们声明为整数。