MySQL中的XOR约束

3

我想在mysql 5.1上实现一种外键xor约束。

有一个表,我们称之为Entity,它可以引用由ValsA和ValsB两个表表示的两种不同的值集。现在我想实现一个约束,确保只有这两个表中的一个被映射,而另一个没有被映射。

在Oracle中,您可以使用类似以下的语句:

CHECK (NVL2(FK_A,1,0)+NVL2(FK_B,1,0)=1));

但据我所知,MySQL现在并不真正支持CHECK约束。有什么想法吗?

我不明白为什么你不会更清晰地实现它:CHECK ( (FK_A IS NULL AND FK_B IS NOT NULL) OR (FK_A IS NOT NULL AND FK_B IS NULL) ) ; - Adam Musch
是的,你说得对。你的陈述更易读。但仍然不会对我有所帮助。但无论如何,我会在我们的Oracle应用中采纳你的建议。谢谢。 - h_b
截至mysql 8.0.16,现在可以使用检查约束:https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html - breiti
1个回答

2

没错。MySQL不支持检查约束。CHECK子句被解析,但是所有存储引擎都会忽略它。

你需要在客户端上强制执行XOR条件。


好的,谢谢。我希望在数据库层面上有一种花哨的替代方法来实现这个逻辑。我的担忧是,如果未来的程序员只接触数据库层面,可能会忽略这个逻辑。例如,通过编写导入脚本。 - h_b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接