2016-01-08 29 views
0

我有一個表稱爲歷史記錄,跟蹤對另一個表進行的更改。基本的想法是能夠追蹤最近一次更新的具體條目。Mysql - 重複鍵插入一個不同的值

當我第一次插入時,它會創建一個條目,將動作字段顯示爲'UPLOAD'。下一次輸入相同的密鑰時,我需要它創建一個新的歷史記錄,其中的操作是'更新',這樣我可以看到它何時首次創建,以及誰在那之後更新了該密鑰。

不幸的是,在DUPLICATE KEY INSERT ...不是一個mysql結構。 我該怎麼辦?

到目前爲止,我有:

INSERT INTO history (key,userID,action,note,date) 
VALUES (?,?,?,?,?) 

*如果行動的價值永遠是「上載」,即使它是一個更新 **問號是從準備好的聲明綁定

如果關鍵在於歷史我需要動作來改變'更新'並創建一個新的條目 - 它不應該改變已經存在的條目。

+0

請詳細說明插入副本時想要發生什麼。 –

+0

你需要設置你的關鍵列是主鍵和自動更新(如1,2,4 ...) – GiapLee

+0

我編輯的問題更清晰 –

回答

3
  1. 可以使用觸發器

    CREATE TRIGGER catchHim BEFORE INSERT ON myTable 
    FOR EACH ROW 
        BEGIN 
        IF EXISTS(SELECT * FROM myTable WHERE userID=NEW.userID) THEN 
         INSERT INTO history (key,userID,action,note,date) VALUES (NEW.myColumn1, NEW.myColumnForUserId, .....); 
        END IF; 
        END; 
    

但他們很難掌握的,特別是沒有人使用他們在MySQL。

  1. 事實上,在進行更新之前,在PHP中驗證該事物是否存在,然後決定是否插入歷史記錄。
+0

我正在考慮在插入之前確認它是否存在,但是我覺得它會花費太長時間從php中查詢sql,(這些值來自一個巨大的Excel電子表格)。 –

+0

這是不可避免的。您可以明確地執行此操作,也可以在發送錯誤消息之前由數據庫引擎執行。但速度很快,因爲它可能是主鍵,因此是聚簇索引。所以不要擔心。 – AlexanderMP

+0

酷!我會試一試。謝謝你的幫助! –

相關問題