使用自动增量和外键

时间:2017-12-12 20:21:22

标签: mysql mariadb on-duplicate-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_ids的所有事件注册,但是开始日期保存在单独的事件表中,因此是连接。

变量就在那里,因为ON DUPLICATE UPDATE不接受没有它的列的引用。

年龄实际上稍微涉及:它是某个类型的下一个活动事件的开始日期的年龄。

字段正在“硬”更新,因为此表中的值由CRM内报告和搜索提取,它们需要存在,无法动态计算。

1 个答案:

答案 0 :(得分:0)

由于你有一个'自然'PK(entity_id),为什么要id

age?您是否必须每天或至少每月更改一次该列?不是一个好的设计。最好在表格中使用恒定的birth_date,然后在SELECT中计算年龄。

“计算出勤的第一年和去年” - 这意味着您有一张表格列出所有出勤年份(yoa)?如果是这样,MAX(yoa)MIN(yoa)可能是更好的计算方法。

在查询中很少需要@variables。

蒙住我的评论;在您提供新查询SHOW CREATE TABLEEXPLAIN和一些示例数据后,请回过头来寻找更多想法。