与mysql中的同一个表的两个n x m关系

时间:2010-03-30 09:56:29

标签: sql mysql

我想创建一个数据库,其中表药物与表物品之间存在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;

2 个答案:

答案 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中声明外键,只是将它们声明为整数。