我試圖插入一個新的行,但如果該鍵已經存在,我想只更新行,如果表中的某個其他值是不同的。這可能在MySQL查詢/語句?條件重複鍵更新
我的表包括以下欄:帽子,手套,名稱,LAST_UPDATE
帽子+手套彌補了唯一索引(說的「帽子」和「手套」的值是顏色)
我們假設這已經在表中:
1. hat=blue mittens=green name=george last_update=tuesday 2. hat=red mittens=green name=bill last_update=monday
在一個新的密鑰上,我想插入像往常一樣。在重複密鑰上,我想只在名稱更改時進行更新,否則忽略。這是因爲我想保留last_update值(timestamp)。
hat=yellow mittens=purple name=jimmy -- insert new row hat=blue mittens=green name=george -- ignore hat=blue mittens=green name=betty -- update row
這是可能的,而不使用單獨的語句來先查找現有的行,比較值,然後在必要時發佈更新?如果是這樣,語法是什麼?
感謝您的回覆。我嘗試了所有這些。事實上,只使用一個簡單的UPDATE語句,如
update tbl set name='george' where hat='blue' and mittens='green'
導致沒有行被更新。但是,無論是使用
INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name='george';
或
INSERT INTO tbl (hat, mittens, name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name=CASE WHEN name <> VALUES(name) THEN VALUES(name) ELSE name END;
不知何故導致該行中被更新(和時間戳改變)。
FWIW,這是我使用的表:
CREATE TABLE `tbl` (
`hat` varchar(11) default NULL,
`mittens` varchar(11) default NULL,
`name` varchar(11) default NULL,
`stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
UNIQUE KEY `clothes` (`hat`,`mittens`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
MySQL是4.1.22版本(也許這事?) 同樣,我對所有的答覆表示感謝。
我猜想,這是你的MySQL版本,這是問題。看起來他們修復了一個bug(http://bugs.mysql.com/bug.php?id=28904)與5.0分支中的INSERT ... ON DUPLICATE KEY UPDATE,4.1分支的主動支持結束後(Dec 31,2006)。我在我的機器上重新創建了表和測試用例,並且它按預期工作,並且正在運行MySQL Server 5.0.67。如果你不能更新你的MySQL安裝,那麼你可能會陷入沒有「單一查詢」解決方案的問題。 – zombat 2009-06-25 19:28:10
確認。這兩種解決方案都適用於5.0.45(不幸的是,這只是一個開發服務器)。再次感謝! – javalina 2009-06-25 20:21:51