我目前正在处理具有可为空外键的模式。 基本上,这就是我想要实现的目标:
给定:
表 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_on
、ends_on
和 type
字段在 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_id
为 NULL
,则 LEFT JOIN 将在 game
表中找不到匹配项,并且其所有列也将为 NULL
。然后 COALESCE()
将负责从 game
表中选择值(如果存在)或从 observer
中选择值。
您可以在 VIEW 中使用该查询(如果您愿意),但我无法判断它是否会在任何用例中表现良好。
这样你就可以存储你的“独立”值而不用担心 game_id
是否设置了,因为它们只会在 game_id
没有设置的情况下使用NULL
.
请注意,您的问题可能会以更“干净”的方式更改模式来解决。对于 game.observer_id
和 observer.game_id
列,它看起来像一个循环 关系,可以将其视为“设计气味” 。但是,在不了解您的数据逻辑的情况下,我无法提出更好的方法。
关于外键的MySQL条件引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50639049/