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

标签 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)
);

这行得通吗?这是一个好的设计吗?

谢谢

最佳答案

这是一个很好的方法(假设您添加了外键定义),但有一个重要的警告: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/

相关文章:

mysql - 用于检查 JSON 数组中是否存在至少一项的 SQL 正则表达式

php - MySQL INSERT 语法错误,不确定原因

mysql - 秀年人未参加

php - yii2 下拉列表 onchange

mysql - 如何在第一个查询中选择行但在第二个查询中不存在?

MySql数据库和qt

mysql - rails : error: database configuration does not specify adapter

MySQL myisam 动态表和 CHAR 类型

php - 通过 PHP 添加 MySQL 帐户

php - MYSQL IF 语句到不同的 WHERE 子句