我有一个主表和临时表,看起来像:
things_temp
+----+--------+--------------+ | id | number | current_time | +----+--------+--------------+ | 1 | 456 | 9/16/2013 | | 2 | 123 | 9/16/2013 | +----+--------+--------------+
things_master
+----+--------+--------------+-----+ | id | number | last_updated | old | +----+--------+--------------+-----+ | 1 | 456 | 9/15/2013 | 0 | | 2 | 234 | 9/15/2013 | 0 | | 3 | 888 | 8/14/2012 | 1 | +----+--------+--------------+-----+
我需要遍历things_temp
表格,如果number
和things_master
中存在相同的old == 0
,请将last_updated
更新为{ {1}}。
否则,如果不满足上述两个条件,只需将记录从current_time
添加到things_temp
,things_master
为last_updated
和current_time
。
现在,我可以轻松获得old = 0
的计数并单独检查每一个。但每张桌子上有40,000条记录,所以我认为这可能是一个坏主意。
我一直在环顾四周,有things_temp
,UNION ALL
,LEFT JOIN
之类的东西似乎都可能是解决方案的一部分,但我有点丢失。
有没有更好的方法来完成我的任务而不遍历INNER JOIN
的每条记录并搜索things_temp
?
答案 0 :(得分:0)
您可以通过滥用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;