![](/img/trans.png)
[英]SQL Before Insert Trigger - insert into another table and update foreign key
[英]Insert/Update on table with autoincrement and foreign key
我有这样一个表:
id entity_id first_year last_year sessions_attended age
1 2020 1996 2008 3 34.7
2 2024 1993 2005 2 45.1
3 ... ... ...
id是自动递增的主键,而entity_id是该表必须唯一的外键。
我有一个查询来计算出勤的第一年和去年,并且我希望每次运行时都能用新数据更新该表,而仅更新第一和去年列:
这是我对“第一年”的插入/更新:
insert into my_table (entity_id, first_year)
( select contact_id, @sd:= year(start_date)
from
( select contact_id, event_id, start_date from participations
join events on participations.event_id = events.id where events.event_type_id = 7
group by contact_id order by event_id ASC) as starter)
ON DUPLICATE KEY UPDATE first_year_85 = @sd;
我有一个类似“去年”的项目,除了目标列和排序依据外,其余均相同。
仅查询返回所需的值,但是我在插入/更新查询时遇到问题。 运行它们时,两个字段的值都相同(正确的first_year值)。
是什么原因引起的?
轶事说明:这似乎可以在MySQL 5.5.54上运行,但是在我本地的MariaDB上运行时,它仅表现出上述行为...
更新:
不是我的桌子设计要支配的。 这是一个CRM,允许最终用户定义自定义字段,我通过外部查询填充数据。
参与表包含所有entity_id的所有事件注册,但是开始日期保存在单独的事件表中,因此是联接。
存在该变量是因为ON DUPLICATE UPDATE将不接受对该列的引用。
实际上,年龄要稍微复杂一些:它是某个类型的下一个活动事件的开始日期之前的年龄。
字段正在“硬”更新,因为此表中的值已被CRM内的报告和搜索提取,它们必须存在且无法动态计算。
由于您具有“自然” PK( entity_id
),因此为什么具有id
?
age
? 您是否必须每天或至少每月更改该列? 不是一个好的设计。 最好在表中有一个恒定的birth_date,然后在SELECT
计算年龄。
“计算出勤的第一年和最后一年”-这意味着您有一张表列出了所有出勤年份( yoa
)? 如果是这样,则MAX(yoa)
和MIN(yoa)
可能是一种更好的计算方式。
一个很少需要查询中的@variables。
蒙克对我的评论; 提供新查询SHOW CREATE TABLE
, EXPLAIN
和一些示例数据后,请返回以获取更多想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.