2017-10-19 61 views
0

有沒有辦法做到這一點?考慮到我有如下表:Mysql更改要插入複製密鑰的值

id | value 
----|------ 
1 | A 
2 | B 

如果我嘗試插入,我得到Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'預期值(1, "C"),考慮id是一個獨特的主鍵。所以,我嘗試使用以下插入一個AFTER INSERT ON觸發器內用下面的插入語句:

INSERT INTO table VALUES (NEW.id, NEW.value) 
ON DUPLICATE KEY UPDATE NEW.id = NEW.id + 5000; 

它消除了重複鍵錯誤,但它只是將不插入重複的一個(或多個)。

我按照瑜珈的建議做了一個程序。這就是它的樣子:

DELIMITER // 
CREATE PROCEDURE set_keys(IN id INT, IN value char(1)) 
BEGIN 
    DECLARE CONTINUE HANDLER FOR 1062 
    SELECT concat('Duplicate keys detected: ',id,', ',value) AS msg; 

    INSERT INTO tests (id, value) VALUES(id + 5000, value); 
END; 
// 

從現在開始做CALL set_keys(NEW.id, NEW.value);正確的方法嗎?

+0

不是簡單的使用一個自動增加的關鍵?附:考慮使用ON DUPLICATE KEY UPDATE不插入新行,只需編輯舊行,以便您1-A變爲5001-A並且1-C丟失 –

+0

@RobertoBisello它會的,但是我從中導入數據另一個數據庫,並且不能修改除插入之外的原始數據庫。如果其他數據庫給我1-C,我應該可以插入它並保留列「value」中的兩個值。 – Newwt

回答

1

而不是直接執行INSERT INTO表,
可以執行此使用PROCEDURE/FUNCTION

待辦事項異常處理重複鍵錯誤下EXCEPTION塊,增加鍵列,並再次RE_RUN的INSERT語句

+0

會做一個像'select count(*)從id = @ id_to_insert'並且創建一個「if count = 1,add 5000」的工作嗎?我很抱歉,我只是不知道* *有關mysql的很多信息:/ – Newwt

+0

@Newwt - 只有問題我看到你的答案是,在每次插入之前,我將運行一個額外的查詢,在異常處理中,我將運行額外的查詢重複記錄只... – Yogi

+0

我告訴自己一點,我想 - 我做了你的建議。你介意檢查我的編輯問題,看看我是否做得對嗎?感謝你目前的幫助! – Newwt