我想在mysql 5.1上实现一种外键xor约束。
有一个表,我们称之为Entity,它可以引用由ValsA和ValsB两个表表示的两种不同的值集。现在我想实现一个约束,确保只有这两个表中的一个被映射,而另一个没有被映射。
在Oracle中,您可以使用类似以下的语句:
CHECK (NVL2(FK_A,1,0)+NVL2(FK_B,1,0)=1));
但据我所知,MySQL现在并不真正支持CHECK约束。有什么想法吗?
我想在mysql 5.1上实现一种外键xor约束。
有一个表,我们称之为Entity,它可以引用由ValsA和ValsB两个表表示的两种不同的值集。现在我想实现一个约束,确保只有这两个表中的一个被映射,而另一个没有被映射。
在Oracle中,您可以使用类似以下的语句:
CHECK (NVL2(FK_A,1,0)+NVL2(FK_B,1,0)=1));
没错。MySQL不支持检查约束。CHECK子句被解析,但是所有存储引擎都会忽略它。
你需要在客户端上强制执行XOR条件。
CHECK ( (FK_A IS NULL AND FK_B IS NOT NULL) OR (FK_A IS NOT NULL AND FK_B IS NULL) )
; - Adam Musch