0

我有一个主表和一个临时表,看起来像:

  • things_temp

    +----+--------+--------------+
    | 编号 | 号码 | 当前时间 |
    +----+--------+--------------+
    | 1 | 第456章 2013 年 9 月 16 日 |
    | 2 | 123 | 2013 年 9 月 16 日 |
    +----+--------+--------------+
    
  • things_master

    +----+--------+--------------+------+
    | 编号 | 号码 | 上次更新 | 旧 |
    +----+--------+--------------+------+
    | 1 | 第456章 2013 年 9 月 15 日 | 0 |
    | 2 | 234 | 2013 年 9 月 15 日 | 0 |
    | 3 | 888 | 2012 年 8 月 14 日 | 1 |
    +----+--------+--------------+------+
    

我需要遍历表,如果ANDthings_temp中存在相同number的表,请将. things_masterold == 0last_updatedcurrent_time

否则,如果以上两个条件都不满足,只需将记录 from与as和相加things_temp即可。things_masterlast_updatedcurrent_timeold = 0

现在,我可以轻松地计算things_temp并单独检查每一个。但是每个表中有大约 40,000 条记录,所以我认为这可能不是一个好主意。

我一直在环顾四周,有类似UNION ALL,的东西LEFT JOININNER JOIN看起来它们可能是解决方案的一部分,但我有点迷失了。

有没有更好的方法来完成我的任务,而无需遍历things_temp和搜索的每条记录things_master

4

1 回答 1

0

您可以通过 abusing 在一个语句中执行此操作replace into,但分两步执行此操作可能更清楚。其他数据库支持merge专为此类事情设计的。

start transaction;

-- update any matching numbers with the data from thing_temp
update 
    things_master m 
        inner join 
    things_temp t
        on m.number = t.number
set
    m.last_updated = t.`current_time`
where
    m.old = 0;

-- add any missing numbers
insert into 
    things_master (number, last_updated, old)
Select
    number, `current_time`, 0
From
    things_temp t
Where
    not exists (
        select
            'x'
        from
            things_master m
        where
            t.number = m.number and
            m.old = 0
    );

commit transaction;
于 2013-09-16T19:25:06.460 回答