我目前正在研究一个外键可以为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中还是应该在模型文件中实现逻辑?
2条答案
按热度按时间v09wglhw1#
考虑在数据检索(select)而不是数据操作(insert/update/delete)时解决您的问题。
在此查询中,如果
o.game_id
是NULL
左连接在中找不到匹配项game
表及其所有列也将NULL
. 那么COALESCE()
将负责从game
表(如果存在或来自)observer
否则。您可以在视图中使用该查询(如果您愿意的话),但是我无法判断它是否在任何用例中都能很好地执行。
这样,您就可以存储“独立”值,而不用担心
game id
设置或不设置,因为只有在game_id
不是NULL
.请注意,您的问题可能会以一种更“干净”的方式来解决,即更改模式。和柱子在一起
game.observer_id
以及observer.game_id
它看起来像一个循环关系,可以看作是“设计气味”。但如果不了解你的数据逻辑,我就无法提出更好的方法。kmpatx3s2#
FOREIGN KEYs
做有限的事情。一旦超越了它们,就应该在应用程序代码(或存储过程或…)中构建自己的事务,以完成更复杂的事情。我觉得这是一条更安全的路线,因为你知道你需要什么,而且不必强迫fks这么做。