我有子表 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)
);
这行得通吗?这是一个好的设计吗?
谢谢
最佳答案
这是一个很好的方法(假设您添加了外键定义),但有一个重要的警告:MySQL 实际上并不强制执行 check
约束。因此,尽管您可以在定义中包含约束,但它不会执行任何操作。
如果你想坚持约束,那么你需要使用触发器。
顺便说一句,如果您想确保只有一列有值,请使用XOR
而不是OR
。这将表示为:
CHECK (try_id IS NULL XOR penalty_try_id IS NULL)
(或者当然,这在 MySQL 中没有做任何事情,只是为了显示正确的逻辑。)
关于mysql - 引用多个表的外键 - 使用多个 FK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27515334/