mysql条件外键引用

whlutmcx  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(331)

我目前正在研究一个外键可以为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上更新 starts_on , ends_on 以及 type 中的字段 observer 如果我引用了 game 但是,如果 game_id 如果为空,我希望上述字段有一个独立的值。这样的事情有可能发生吗 IF 在mysql中还是应该在模型文件中实现逻辑?

v09wglhw

v09wglhw1#

考虑在数据检索(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 左连接在中找不到匹配项 game 表及其所有列也将 NULL . 那么 COALESCE() 将负责从 game 表(如果存在或来自) observer 否则。
您可以在视图中使用该查询(如果您愿意的话),但是我无法判断它是否在任何用例中都能很好地执行。
这样,您就可以存储“独立”值,而不用担心 game id 设置或不设置,因为只有在 game_id 不是 NULL .
请注意,您的问题可能会以一种更“干净”的方式来解决,即更改模式。和柱子在一起 game.observer_id 以及 observer.game_id 它看起来像一个循环关系,可以看作是“设计气味”。但如果不了解你的数据逻辑,我就无法提出更好的方法。

kmpatx3s

kmpatx3s2#

FOREIGN KEYs 做有限的事情。一旦超越了它们,就应该在应用程序代码(或存储过程或…)中构建自己的事务,以完成更复杂的事情。
我觉得这是一条更安全的路线,因为你知道你需要什么,而且不必强迫fks这么做。

相关问题