gpt4 book ai didi

外键的MySQL条件引用

转载 作者:可可西里 更新时间:2023-11-01 07:07:42 25 4
gpt4 key购买 nike

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

给定:

表 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com