2010-05-25 50 views
0

首先,簡化版本:我想知道是否可以在INSERT(實際上是LOAD DATA INFILE)期間創建觸發器來激活,並且不會爲我的表中已經存在的RMA輸入記錄?觸發在LOAD DATA INFILE期間跳過某些插入

我有一個沒有獨特記錄的表。有些可能是合法的重複,但有一個字段可用於瞭解數據是否已輸入。例如

RMA  Op  Days 
--------------------- 
213 Repair 0.10 
213 Test 0.20 
213 Repair 0.10 

所以我可以做三列的索引在一起,但是當你看到它的可能的RMA是在同一時間量內進行二次所以它可能有重複的記錄。基本上,我想讓Trigger說如果NEW.rma已經在表格中,請跳到下一行。

我發現有辦法使觸發器暫停插入,所以我想我現在的問題是,如何跳過插入並在LOAD DATA INFILE調用期間繼續休息?

+0

格式不適用於我的示例。基本上有3列(RMA - Op - Days)表明RMA在該操作步驟中花費了多少天。 – Geoff 2010-05-25 16:03:32

回答

0

您可以設置從RMA和OP派生的複合密鑰嗎?這會導致重複條目顯示爲錯誤。

+0

重複項不是錯誤,這是我的問題。在帖子中看到的數據是一個有效的條目。但我不想要的是爲了再次輸入這三行。 我有一個自動化的報告運行Excel文件,從Oracle查詢報告,然後將數據插入到我的數據庫。它從當前月份的第一個運行到當前日期並運行LOAD DATA INFILE。與我的其他報告,它工作正常,因爲LOAD DATA INFILE將跳過重複,但在這裏沒有辦法讓LOAD DATA INFILE知道,所以我必須以某種方式捕捉它。 – Geoff 2010-05-25 16:57:50

+0

我總是從運行上次報告時開始運行,但有時候我會從Oracle報告查詢中收到錯誤,所以我並不總是確定它最後運行的確切時間,並且它更容易加載所有數據本月至今。 – Geoff 2010-05-25 16:58:53

0

我能想到的最簡單的方法是加載到一個新表中,然後刪除舊的並重命名新的。 LOCK TABLES應該能夠在最後隔離該開關。

或者,如果您確信行在插入文件中出現的順序 - 即,如果確保該文件具有舊行,然後是新行 - 則可以先執行COUNT(*),然後跳過加載時的行數。

1

無需使用鎖表...做這種方式(我說的表名是rmainfo):

create table rmainfo_new like rmainfo; 
load data infile 'filename' into table rmainfo_new; 
rename table rmainfo to rmainfo_old,rmainfo_new to rmainfo; 
drop table rmainfo_old; 

你也可以把DROP TABLE開頭(使其DROP TABLE IF EXISTS rmainfo_old)這將使運行之間的_old表保留備份/參考