考虑在数据检索(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将在游戏表中找不到匹配项,并且其所有列也将为NULL.然后COALESCE()将负责从游戏表中选择值(如果存在)或从观察者那里选择.
您可以在VIEW中使用该查询(如果您愿意),但我不知道它在任何用例中是否表现良好.
通过这种方式,您可以存储“独立”值而无需担心游戏ID是否已设置,因为只有在game_id不为NULL时才会使用它们.
请注意,您的问题可能会以更“干净”的方式解决,从而改变架构.使用列game.observer_id和observer.game_id,它看起来像一个循环关系,可以被认为是“设计气味”.但是,如果不了解您的数据逻辑,我无法提出更好的方法.