创建MySql表之间的关系

创建MySql表之间的关系,mysql,foreign-keys,constraints,indexing,Mysql,Foreign Keys,Constraints,Indexing,我试图在MySql中的四个表之间创建关系: mainnodes (ID) subnodes (ID) tagrelationship (NODEID & TAGID) tag (ID) 表“tagrelationship”引用“mainnodes”,因此当我尝试插入时,我可以从“mainnodes”表中选择记录,但是我也希望能够从“subnodes”表中选择记录 我尝试过为“tagrelationship”设置表结构,如下所示: CREATE TABLE IF NOT EXISTS

我试图在MySql中的四个表之间创建关系:

mainnodes (ID)
subnodes (ID)
tagrelationship (NODEID & TAGID)
tag (ID)
表“tagrelationship”引用“mainnodes”,因此当我尝试插入时,我可以从“mainnodes”表中选择记录,但是我也希望能够从“subnodes”表中选择记录

我尝试过为“tagrelationship”设置表结构,如下所示:

CREATE  TABLE IF NOT EXISTS `database`.`tagrelationship` (
`NODEID` INT(11) NOT NULL ,
 `TAGID` INT(11) NOT NULL ,
PRIMARY KEY (`TAGID`, `NODEID`) ,
INDEX `TAGS_TAGRELATIONSHIP` (`TAGID` ASC) ,
INDEX `SUB_TAGRELATIONSHIP` (`NODEID` ASC) ,
CONSTRAINT `TAGS_AGRELATIONSHIP`
  FOREIGN KEY (`TAGID` )
  REFERENCES `database`.`tags` (`ID` )
  ON DELETE CASCADE,
CONSTRAINT `MAINNODES_CMSTAGRELATIONSHIP`
  FOREIGN KEY (`NODEID` )
  REFERENCES `database`.`mainnodes` (`ID` )
  ON DELETE CASCADE,
CONSTRAINT `SUBNODES_CMSTAGRELATIONSHIP`
  FOREIGN KEY (`NODEID` )
  REFERENCES `database`.`subnodes` (`ID` )
  ON DELETE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
这执行得很好,但我只能从“subnodes”表中选择记录,而不能同时选择两者

我怎样才能做到这一点


谢谢

问题是您的第二个NODEID约束正在覆盖第一个约束

这是您希望创建的多态关系,因此仍然利用数据库外键约束的一个可能的解决方案是为
主节点
子节点
使用多态“supertable”,称为类似
节点

CREATE  TABLE IF NOT EXISTS `database`.`nodes` (
`ID` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ID`))
CREATE  TABLE IF NOT EXISTS `database`.`tagrelationship` (
...
CONSTRAINT `TAGS_AGRELATIONSHIP`
  FOREIGN KEY (`TAGID` )
  REFERENCES `database`.`tags` (`ID` )
  ON DELETE CASCADE,
CONSTRAINT `NODES_CMSTAGRELATIONSHIP`
  FOREIGN KEY (`NODEID` )
  REFERENCES `database`.`nodes` (`ID` )
  ON DELETE CASCADE,
...)
然后,让每个“子表”使用外键约束引用它:

CREATE  TABLE IF NOT EXISTS `database`.`mainnodes` (
...
`NODEID` INT(11) NOT NULL,
CONSTRAINT `MAINNODE_NODE_RELATIONSHIP`
  FOREIGN KEY (`NODEID` )
  REFERENCES `database`.`nodes` (`ID` )
  ON DELETE CASCADE,
...)

CREATE  TABLE IF NOT EXISTS `database`.`subnodes` (
...
`NODEID` INT(11) NOT NULL,
CONSTRAINT `SUBNODE_NODE_RELATIONSHIP`
  FOREIGN KEY (`NODEID` )
  REFERENCES `database`.`nodes` (`ID` )
  ON DELETE CASCADE,
...)
最后,您的
tagrelationship
表只能引用超级表
节点

CREATE  TABLE IF NOT EXISTS `database`.`nodes` (
`ID` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ID`))
CREATE  TABLE IF NOT EXISTS `database`.`tagrelationship` (
...
CONSTRAINT `TAGS_AGRELATIONSHIP`
  FOREIGN KEY (`TAGID` )
  REFERENCES `database`.`tags` (`ID` )
  ON DELETE CASCADE,
CONSTRAINT `NODES_CMSTAGRELATIONSHIP`
  FOREIGN KEY (`NODEID` )
  REFERENCES `database`.`nodes` (`ID` )
  ON DELETE CASCADE,
...)

一个简单但不太可靠的解决方案是简单地删除关于NODEID可以引用的内容的最后两个约束,并使用应用程序代码强制执行该约束。

感谢您的回复。当我将索引添加到nodes表时,我得到以下警告:主索引和NODE_ID似乎相等,其中一个可能被删除。“这还可以吗?”罗伯特,我错了。是的,应该只有主索引。更新了我的答案,没问题。我不确定我的方法现在是否有效。基本上,我正在尝试在Umbraco中设置一个自定义内容部分。不确定您是否对此有经验,但基本上,当它创建默认节点/文档时,它会按以下顺序将记录添加到3个表中:umbranode cmscontent cmsdocument然后“tagsrelationship”表引用“umbranode”表。在umbraco教程中,他们为自定义内容节点创建了一个表,并且根本不引用上面的表。不确定该表是否应链接到上述3个表。对不起,我不熟悉Umbraco。