我需要更新表中預先計算的數據可以添加/更新/刪除的表中的值。insert ... select ...重複鍵更新+刪除過時的行
我可以用
insert into precalculated(...)
select ... from ...
on duplicate key update ...
添加/更新預先計算表,但有一個優化的方法來刪除過時的行?
我需要更新表中預先計算的數據可以添加/更新/刪除的表中的值。insert ... select ...重複鍵更新+刪除過時的行
我可以用
insert into precalculated(...)
select ... from ...
on duplicate key update ...
添加/更新預先計算表,但有一個優化的方法來刪除過時的行?
我可能發現我的解決方案使用重命名。
所以基本上,我會做一個簡單的插入選擇到臨時表中,然後
rename precalculated to precalculated_temprename, precalculated_temp to precalculated, precalculated_temprename to precalculated_temp;
truncate precalculated_temp;
需要一些測試,但它似乎重命名操作是快速和原子。
我認爲你應該創建一個存儲過程,刪除相關表的數據當且僅當記錄滿足條件。
有沒有在你的問題設計流程足夠的信息,但我可以給你一個小例子:
delimiter $$
create procedure delete_orphans()
begin
declare id_orphan int;
declare done int default false;
declare cur_orphans cursor for
select distinct d.id
from data as d
left join precalculated as p on d.id = p.id
where p.id is null;
declare continue handler for not found set done = true;
open cur_orphans;
loop_delete_orphans: loop
fetch cur_orphans into id_orphan;
if done then
leave cur_orphans;
end if;
delete from data where id = id_orphan;
end loop;
close cur_orphans;
end$$
delimiter ;
此過程將刪除data
表中每一行不具有至少一個相關排在precalculated
表中。
當然,這種方法可能是無益的,因爲它會逐一刪除行,但正如我所說的,這只是一個例子。您可以自定義它以適應您的需求。
如果需要,可以從觸發器調用此過程(使用call delete_orphans()
)。
希望這會有所幫助。
這是另一種方式。我不想從主表中刪除的預先計算的行刪除/不再使用。無論如何是的,我可以使用左連接和刪除預先計算的行來比較數據,但我需要知道我是否能找到更優雅的東西。好像不是...... – medmed 2014-09-29 17:33:52
然而,我可能會去觸發解決方案。正如我回答Andreas Wederbrand所說,「我認爲這是我將如何結束這樣做的過程,但我仍然需要一些腳本來清理表格,因爲預先計算的數據也取決於日期(我想刪除不在開始和結束之間的行結束日期)和一些計數器。「沒有我想要的那麼優雅,但它應該起作用。謝謝。 – medmed 2014-09-29 17:41:33
@medmed您可以創建一個存儲過程來刪除不再需要的行,並且可以從觸發器調用該存儲過程。 – Barranka 2014-09-29 19:15:25
您可以在維護precalculated
的主表上添加用於插入,刪除和更新的觸發器。
當插入或更新相同的代碼可以用來計算值,並出具了replace into precalculated (...) values (...)
當刪除它可能是相同的,與另外,你還可以從precalculated
是孤兒刪除行。在這裏很聰明,並使用原始刪除的值爲precalculated
查詢孤兒,而不是執行表掃描。
,我認爲這是我將如何結束這樣做的。但是由於預先計算的數據也取決於日期(我想刪除不在開始日期和結束日期之間的行)以及一些計數器,所以我仍然需要一些腳本來清理表。謝謝。 – medmed 2014-09-29 17:35:07
當你說過時你是指那些沒有使用這個腳本更新的行? – 2014-09-29 16:45:20
我的意思是從主表中刪除的數據。從主表中刪除的數據應該從預先計算的表中刪除。所以基本上,是的,沒有更新的數據。 – medmed 2014-09-29 16:47:02
在正在刪除的表上創建一個觸發器,檢查是否存在「孤立」行並刪除它們 – Barranka 2014-09-29 16:48:24