gpt4 book ai didi

sql - mysql中同一张表的两个n x m关系

转载 作者:行者123 更新时间:2023-11-30 23:52:06 26 4
gpt4 key购买 nike

我想创建一个数据库,其中表 drug 和表 article 之间有 n x m 关系,表 target 和表 article 之间有 n x m 关系。

我收到错误:无法删除或更新父行:外键约束失败我必须更改我的代码中的哪些内容?

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;

最佳答案

您正在尝试乱序创建表。

例如,您正在尝试创建 contiansdrug 表,该表在 drugs 表之前引用 drugs 表。

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

我建议将命令按正确的顺序排列。或者,您可以选择暂时关闭检查并在交易中运行创建凭证,请参阅说明 here

相关部分是

SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;

.. your script..

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

编辑:

好的,尽量不要对约束使用相同的名称。阅读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.

编辑2:

为了说明,你有重复的约束符号 article,重命名它,一切都会好起来的。

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

关于sql - mysql中同一张表的两个n x m关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2544255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com