我试图在MySql中创建四个表之间的关系:
mainnodes (ID)
subnodes (ID)
tagrelationship (NODEID & TAGID)
tag (ID)
表'标签关系'参考'主要节点'因此,当我尝试插入时,我可以从“主节点”中选择记录。 table,但我希望能够从'子节点中选择'表以及。
我已经尝试设置表格结构以及#39; 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;
此操作正常,但我只能从'子节点中选择记录。表不是两个。
我如何实现这一目标?
由于
答案 0 :(得分:1)
问题是你的第二个NODEID CONSTRAINT正在覆盖第一个。
这是您要创建的多态关系,因此仍然利用数据库外键约束的一种可能解决方案是对mainnodes
和subnodes
使用多态“supertable”,称为nodes
:
CREATE TABLE IF NOT EXISTS `database`.`nodes` (
`ID` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ID`))
然后让每个“子表”用外键约束引用它:
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
表只能引用超级表格nodes
:
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可以引用的最后两个约束,并使用您的应用程序代码来强制执行约束。