2013-08-22 19 views
1

我的問題是關於批量插入+更新,插入或根據任何列

我想通過一個特定的列中插入大量的數據和更新相同的,而不是在同一時間的主鍵更新。所以我不能使用INSERT...ON DUPLICATE KEY UPDATE

有沒有辦法做到這一點?

例如我有一個「人」表,它有「名稱」 - 「電話」 - 「安全號碼」列。 第一次批量插入,我添加新的人,但不想要一個同名的新記錄,只是更新其他信息(電話和安全號碼) 另一個插入操作,我添加新的人,但不要想要一個具有相同電話號碼的新記錄,只需更新其名稱和安全號碼即可。 (這個例子可能有點荒謬,對不起)

+0

1.由於它不是唯一的列,如果幾個行該列具有相同的數據,您將更新他們的? 2.您是否動態定義哪些列是特定的列還是始終相同? 3.您可以指定多個列,還是隻有一個? 4.你能提供一個小數據例子嗎? –

+0

1.我想添加新的人物數據,並且不添加相同的姓名/電話號碼/姓氏/等等。這是可以改變的。 2.是列是動態定義的。 3.不多,只有一列 – zato

回答

0

你可以使用唯一的鍵索引而不是主鍵。和你插入的SQL將是相同的。

只是改變表格並在指定列上添加唯一索引。

+0

感謝您的回覆,但我不能這樣做,因爲列是可更改的。它可以通過名稱,然後通過電話號碼等。所以我不能添加唯一鍵 – zato

1

這可能不是唯一的解決方案,但這是我首先想到的。編寫你的觸發器並在你每次批量插入時動態創建它(從你的代碼中執行sql),並在插入之後刪除它,所以下次你可以檢查不同的列。僞代碼:

CREATE TRIGGER ON INSERT 
BEGIN 
    DECLARE t int; 
    SELECT t = COUNT(1) FROM table WHERE your_defined_column = inserted.your_defined_column 
    IF(t > 0) 
    BEGIN 
     UPDATE table SET all_columns... WHERE your_defined_column = inserted.your_defined_column 
     --STOP FROM INSERTING 
    END 
    ELSE 
     --LET IT INSERT 
    END 
END 

希望這有助於:)

+0

感謝您的回覆,它似乎很好:)但它會減少批量插入性能?觸發器查詢選擇每個插入操作。 – zato

+0

那麼,它肯定會降低它的表現。但是,我不知道它是1%還是50%。如果你嘗試這種方式,並發現,讓我知道:) –

+0

好吧,我會讓你知道,每當我嘗試它,再次thansk – zato