2017-04-17 50 views
1

我知道我可以使用INSERT ... ON DUPLICATE KEY UPDATE,但是我怎樣才能做到這一點,當涉及的鑰匙是而不是的主鑰匙?例如:如何在MySql中當鑰匙不是PRIMARY KEY時「更新時重複插入」

CREATE TABLE tablename (
    id INT PRIMARY KEY, 
    transId VARCHAR(64), 
    pltCode VARCHAR(64), 
    val1 VARCHAR(6), 
    val2 VARCHAR(6) 
); 

INSERT INTO tablename VALUES(1,'001','abc','val1','val2'); 

如果transIdpltCode已經存在,我想更新原來的記錄。否則,請插入一個新的。 SQL應該是什麼樣的?

+0

怎麼辦'upsert'或'merge'中搜索MySQL的。如果您希望有人通過查詢來幫助您,請創建一個包含示例數據和預期輸出的小提琴。 – Utsav

回答

0

你只需要先創建這些兩列的UNIQUE指數:

ALTER TABLE `tablename` ADD UNIQUE `unique_index`(`transId`, `pltCode`); 

或者更好的是,創建一個新表:

CREATE TABLE tablename (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    transId VARCHAR(64), 
    pltCode VARCHAR(64), 
    val1 VARCHAR(6), 
    val2 VARCHAR(6), 
    PRIMARY KEY (id), 
    UNIQUE `unique_index`(`transId`, `pltCode`) 
); 

字段屬性NOT NULL正在使用,因爲我們不希望此 字段爲NULL。所以如果用戶試圖用NULL值創建一條記錄,那麼MySQL會產生一個錯誤。

字段屬性AUTO_INCREMENT告訴MySQL繼續並將 下一個可用編號添加到id字段。所以你不必每次都手動設置它。

關鍵字PRIMARY KEY用於將列定義爲主鍵。您可以使用多個用逗號分隔的列來定義主鍵。

關鍵字UNIQUE表示兩行不能有相同的索引 值。

參考This sitepoint tutorial on table creation for more info:

然後做一個ON DUPLICATE KEY UPDATE修改其他列重複鍵在收到時同時插入:

INSERT INTO tablename (
    transId, pltCode, val1, val2 
) values('001','abc','val1','val2') 
ON DUPLICATE KEY UPDATE val1 = new_val1, val2 = new_val2; 
相關問題