2014-09-29 32 views
1

我需要更新表中預先計算的數據可以添加/更新/刪除的表中的值。insert ... select ...重複鍵更新+刪除過時的行

我可以用

insert into precalculated(...) 
select ... from ... 
on duplicate key update ... 

添加/更新預先計算表,但有一個優化的方法來刪除過時的行?

+0

當你說過時你是指那些沒有使用這個腳本更新的行? – 2014-09-29 16:45:20

+0

我的意思是從主表中刪除的數據。從主表中刪除的數據應該從預先計算的表中刪除。所以基本上,是的,沒有更新的數據。 – medmed 2014-09-29 16:47:02

+1

在正在刪除的表上創建一個觸發器,檢查是否存在「孤立」行並刪除它們 – Barranka 2014-09-29 16:48:24

回答

0

我可能發現我的解決方案使用重命名。

所以基本上,我會做一個簡單的插入選擇到臨時表中,然後

rename precalculated to precalculated_temprename, precalculated_temp to precalculated, precalculated_temprename to precalculated_temp; 
truncate precalculated_temp; 

需要一些測試,但它似乎重命名操作是快速和原子。

1

我認爲你應該創建一個存儲過程,刪除相關表的數據當且僅當記錄滿足條件。

有沒有在你的問題設計流程足夠的信息,但我可以給你一個小例子:

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())。

希望這會有所幫助。

+0

這是另一種方式。我不想從主表中刪除的預先計算的行刪除/不再使用。無論如何是的,我可以使用左連接和刪除預先計算的行來比較數據,但我需要知道我是否能找到更優雅的東西。好像不是...... – medmed 2014-09-29 17:33:52

+0

然而,我可能會去觸發解決方案。正如我回答Andreas Wederbrand所說,「我認爲這是我將如何結束這樣做的過程,但我仍然需要一些腳本來清理表格,因爲預先計算的數據也取決於日期(我想刪除不在開始和結束之間的行結束日期)和一些計數器。「沒有我想要的那麼優雅,但它應該起作用。謝謝。 – medmed 2014-09-29 17:41:33

+0

@medmed您可以創建一個存儲過程來刪除不再需要的行,並且可以從觸發器調用該存儲過程。 – Barranka 2014-09-29 19:15:25

1

既然你一直在增加或更新中存在的這些其他表中的行,和你想刪除不存在任何行,你爲什麼不只是:

DELETE FROM precalculated 
insert into precalculated(...) 
select ... from ... 
on duplicate key update ... 

總是在啓動清潔手段你以後不必擔心孤兒。

+0

我無法從此表中刪除數據。這會破壞服務,直到數據恢復。 – medmed 2014-09-29 17:28:42

+0

如果你把整個陳述封裝成單個交易 – Sabine 2017-03-05 00:09:34

1

您可以在維護precalculated的主表上添加用於插入,刪除和更新的觸發器。

當插入或更新相同的代碼可以用來計算值,並出具了replace into precalculated (...) values (...)

當刪除它可能是相同的,與另外,你還可以從precalculated是孤兒刪除行。在這裏很聰明,並使用原始刪除的值爲precalculated查詢孤兒,而不是執行表掃描。

+0

,我認爲這是我將如何結束這樣做的。但是由於預先計算的數據也取決於日期(我想刪除不在開始日期和結束日期之間的行)以及一些計數器,所以我仍然需要一些腳本來清理表。謝謝。 – medmed 2014-09-29 17:35:07