外键引用多个表 - 使用多个FK

时间:2014-12-16 22:42:40

标签: mysql

我有子表A,需要引用两个不同的表中的任何一个,B和C. B和C相似但需要在不同的表中。

据我了解,mysql只允许FK引用一个表。因此,在查看了其他解决方案之后,我决定在A中创建两个列以引用B或C.因为它应该只是B或C我已经在约束中添加以防止它们都是NOT NULL:

CREATE TABLE conversions
(
id INT AUTO_INCREMENT,
kicker_id INT NOT NULL,
success BOOL NOT NULL,
try_id INT,
penalty_try_id INT,
PRIMARY KEY (id),
FOREIGN KEY (try_id),
FOREIGN KEY (penalty_try_id),

CONSTRAINT conversions_coll_null CHECK (try_id IS NULL OR penalty_try_id IS NULL)
);

这会有用吗?这是一个好的设计吗?

由于

1 个答案:

答案 0 :(得分:2)

这是一种很好的方法(假设您添加了外键定义),但有一个重要的警告:MySQL实际上并没有强制执行check约束。因此,虽然您可以在定义中包含约束,但它不会做任何事情。

如果你想坚持约束,那么你需要使用一个触发器。

顺便说一句,如果您想确保其中一列完全具有值,请使用XOR而不是OR。这将表示为:

CHECK (try_id IS NULL XOR penalty_try_id IS NULL)

(当然,这在MySQL中没有做任何事情,但只是为了显示正确的逻辑。)