MySQL外键的条件引用

MySQL外键的条件引用,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 现在,我想做的是,如果

我目前正在研究一个外键为空的模式。 基本上,这就是我想要实现的目标:

鉴于:

表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
现在,我想做的是,如果我有一个对游戏的引用,我想复制初始值,并在cascade上更新开始,结束,并在观察者表中键入字段,但是如果游戏id为null,我想为上述字段设置一个独立的值。在mysql中,IF可以实现这样的功能吗?或者我应该在模型文件中实现逻辑吗?

外键只做有限的事情。一旦你超越了它们,你应该在你的应用程序代码或存储过程或。。。做更复杂的事情


我觉得这是一条更安全的路线,因为您完全知道自己需要什么,不必强迫FKs去做。

考虑在数据检索时解决您的问题,选择而不是数据操作插入/更新/删除

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_id为NULL,左连接将在game表中找不到匹配项,其所有列也将为NULL。然后,COALESCE将负责从游戏表中选择值(如果存在),或者从观察者中选择值

如果愿意,您可以在视图中使用该查询,但我无法判断它是否在任何用例中都能很好地执行

通过这种方式,您可以存储独立值,而无需担心是否设置了游戏id,因为只有在游戏id不为NULL时才会使用这些值


请注意,通过更改模式,您的问题可能会以更干净的方式得到解决。在game.observer_id和observer.game_id列中,它看起来像一个循环关系,可以将其视为设计气味。但是,如果不了解您的数据逻辑,我无法提出更好的方法。

我没有得到要求,您说我想复制初始值是什么意思?我也不清楚更新要求。在删除时,您想要什么独立值?