2017-07-03 48 views
0

我對MySQL的行爲有個疑問。MySQL替換成具有唯一約束的行爲

想象一下表3(相關)列:

id (PK + AI),somedate,someuser,etc... 

我已經穿上了(日期,用戶)的唯一約束。所以,當我開始用乾淨的測試表,並兩次運行下面的查詢:

REPLACE INTO `testtable` (somedate,someuser) VALUES('2017-01-01','admin'); 

我期待與「ID」列一排1.而是每次我運行此查詢的ID去,因爲向上自動增量,我不能發生這種情況(這會破壞我的數據關係)。爲什麼是這樣?我能否做到這一點,以便在發生替換時保留原始主鍵?

+1

顯示此表的REAL模式 – RiggsFolly

+0

爲什麼不使用'update'? –

+0

@PrabhatG因爲我想快速和骯髒;)嚴肅地說:我只是偶然發現了這種行爲,我想更好地理解它。 – jwebdev

回答

1

不符合REPLACE。這就像是INSERT之後是DELETE。你REPLACE觀察它的動作是一樣的,如果你執行這兩條語句,你會看到的行爲:

DELETE FROM `testtable` WHERE somedate = '2017-01-01' and someuser = 'admin'; 
INSERT INTO `testtable` (somedate,someuser) VALUES ('2017-01-01','admin'); 

這意味着在新插入的行的AUTO_INCREMENT列將有一個新的價值。


也許考慮使用INSERT ... ON DUPLICATE KEY UPDATE

參考:https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

(請注意,企圖插入得到更新將使用AUTO_INCREMENT值的行。)

0

對我來說,看起來就像你真正想要的UPDATE語句,而像

update `testtable` 
set somedate = '2017-01-01', 
    someuser = 'admin' 
where id = <id of the record> ;