0

使用 MySQL,从 MyISAM 转移到 InnoDB 表。数据库设计从转储数据开始,然后在没有外键或约束的情况下重新导入。一次添加一个以查找错误。

我有ParentTable哪个可以链接到ChildTableAChildTableB,但不能同时链接到两者。语法应该CREATE是:(CREATE为了简单起见,使用语法而不是多个ALTERs)

CREATE TABLE `ParentTable`
   `IDParentTable` bigint(20) unsigned NOT NULL auto_increment,
   `IDChildTableA` bigint(20) unsigned NOT NULL default '0',
   `IDChildTableB` bigint(20) unsigned NOT NULL default '0',
   PRIMARY KEY (`IDParentTable`),
   KEY `ParentTable_IDChildTableA` (`IDChildTableA`),
   KEY `ParentTable_IDChildTableB` (`IDChildTableB`)
ENGINE=InnoDB DEFAULT CHARSET=latin1;

我不假思索地尝试包括:

CONSTRAINT `ParentTable_IDChildTableA` FOREIGN KEY (`IDChildTableA`) REFERENCES `ChildTableA` (`IDChildTableA`),
CONSTRAINT `ParentTable_IDChildTableB` FOREIGN KEY (`IDChildTableB`) REFERENCES `ChildTableB` (`IDChildTableB`)

失败了,因为很多行有 0 IDChildTableA,很多行有 0 IDChildTableB。但是,没有行两者都为 0。它看到 0 不ChildTableA存在IDChildTableA,B 也一样。

在保持参照完整性的同时,是否有适当的方法来处理这种情况?不用ParentTable一分为二?如果它是 0 或引用有效的相关表,可以说没关系?或者,想要多态表是否意味着我必须不受约束?顺便说一句,我更喜欢这条路线,而不是有一个IDChildTable外键,然后有另一列指定它是表 A 还是 B ......不是我认为这对约束有效,只是说我不想走那条路线.. .

4

1 回答 1

1

用作外键的列可以为空。在外键列中使用 NULL 值表示“没有引用行”。

看起来你的外键是倒着的。通常,子表具有对父表的引用。

parent (id int primary key) 

childA (id int,  parent_id int, ...)

childB (id int,  parent_id int, ...)

编辑

与有关引用两个表的外键列(基于鉴别器列)的问题相关......这是不可能的。外键约束只能引用一个表。

要获得类似的工作,您需要添加两个单独的外键列,每个都引用一个目标表。您可以使用额外的鉴别器列(A 或 B)来识别应该使用哪个外键列,因此一个 fk 列将填充一个引用,另一个 fk 列将设置为 NULL。

但是,没有声明性约束需要恰好填充这两个 fk 列之一。这不会由数据库强制执行。额外的鉴别器列实际上是多余的,因为您可以根据填充了哪个外键列来派生。

于 2013-09-01T22:37:27.570 回答