2010-03-30 63 views
1

我想创建一个数据库,其中表药物和表项之间有n×m的关系,表目标和表项之间有n×m的关系。与mysql中的同一个表有两个n×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

我解决了这个问题,没有在MySql中声明外键,而只是将它们声明为整数。

+0

-1这绝对不是给定问题的解决方案。外键(参照完整性关系)是RDBMS的全部内容,并且绝对是一种不会强迫您更改设计的解决方案。 – Unreason 2010-04-03 10:43:20

1

您正在尝试创建无序表。

例如,您正在尝试创建contiansdrug表,其中涉及药物表之前的表药物。

请记住,任何SQL,甚至是DDL,都会尝试使数据库保持一致状态。

我会建议把命令按正确的顺序。或者你有选择暂时关闭的检查并运行内幕交易创造纸条,看到说明here

相关章节

SET AUTOCOMMIT = 0; 
SET FOREIGN_KEY_CHECKS=0; 

.. your script.. 

SET FOREIGN_KEY_CHECKS = 1; 
COMMIT; 
SET AUTOCOMMIT = 1; 

编辑:

OK,尽量不要有相同的名字为了约束。阅读fine手动启发:

If the CONSTRAINT symbol clause is given, the symbol value must be unique in the database. If the clause is not given, InnoDB creates the name automatically.

EDIT2:

拼写出来,你有重复的约束符号article,重命名它和所有将被罚款。

标准做法是如果您将约束命名为使用描述相关内容的名称,例如containsdrug_acticelid_article_id(firsttablename_column_secondtablename_column)将是唯一且描述性的。

+0

嗯,这不是主要的错误。订单来自错误地复制。我纠正了问题中的顺序。 – Christian 2010-03-30 10:34:25

相关问题