外键的MySQL条件引用

标签 mysql

我目前正在处理具有可为空外键的模式。 基本上,这就是我想要实现的目标:

给定:

表 1:

game:
  id
  observer_id
  starts_on
  ends_on
  type

表 2:

observer:
  id
  game_id DEFAULT NULL
  starts_on
  ends_on
  type
  FOREIGN KEY (`game_id`) REFERENCES `game`(`id`) ON DELETE SET NULL

现在,我想做的 - 我想复制初始值并更新级联 starts_onends_ontype 字段在 observer 表中,如果我有对 game 的引用,但是如果 game_id 为空,我想为上述字段提供独立的值。在 mysql 中使用 IF 是否可以实现类似的事情,或者我应该在我的模型文件中实现逻辑?

最佳答案

考虑在数据检索 (SELECT) 而不是数据操作 (INSERT/UPDATE/DELETE) 时解决您的问题。

select
    o.id,
    o.game_id,
    coalesce(g.starts_on, o.starts_on) as starts_on,
    coalesce(g.ends_on,   o.ends_on)   as ends_on,
    coalesce(g.type,      o.type)      as type
from observer o
left join game g on g.id = o.game_id

在此查询中,如果 o.game_idNULL,则 LEFT JOIN 将在 game 表中找不到匹配项,并且其所有列也将为 NULL。然后 COALESCE() 将负责从 game 表中选择值(如果存在)或从 observer 中选择值。

您可以在 VIEW 中使用该查询(如果您愿意),但我无法判断它是否会在任何用例中表现良好。

这样你就可以存储你的“独立”值而不用担心 game_id 是否设置了,因为它们只会在 game_id 没有设置的情况下使用NULL.

请注意,您的问题可能会以更“干净”的方式更改模式来解决。对于 game.observer_idobserver.game_id 列,它看起来像一个循环 关系,可以将其视为“设计气味” 。但是,在不了解您的数据逻辑的情况下,我无法提出更好的方法。

关于外键的MySQL条件引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50639049/

相关文章:

php - MySQL 插入或删除存储过程

mysql - MySQL 触发器是否受到用户限制?

mysql - 无法使用 Zend Framework 连接到外部数据库,但 mysql_connect 可以工作

MySQL:查询以计算在数据范围之间找到几个月的最后一天的次数

PHP MySQL 数据库列引用

mysql - 根据具有分钟时间戳的行获取每小时平均金额

mysql - 根据计数删除行(*)

MySQL MyISAM - 不加锁进行插入

c# - 通过 SQL 命令更新大型数据集

php - 在 PHP 中使用 PDO 在设定时间后更新 MySQL 行