2013-07-20 55 views
1

對此查詢有問題。 (MySQL的)關於DUPLICATE KEY更新(使用多個where子句)

我有一個主鍵(id),我想要麼插入一個新的值,如果不存在,或者更新現有的條件:

INSERT into records (name, value, p_id, c_id) 
VALUES ('Store', 'TX', 1188913, 1133) 
ON DUPLICATE KEY UPDATE name = 'TX' WHERE p_id = 6188002 and c_id = 77102 

因此,在這種情況下,我會有記錄這樣一個已經存在:

id = 10235192 
name = 'Store' 
value = 'AL' 
p_id = 6188002 
c_id = 77102 

而且我希望這個紀錄是由值更新=「AL」到「TX」

但所有我看到的是一個新的記錄插入。我究竟做錯了什麼?

回答

2

您應該在複合列上指定UNIQUE約束條件以使INSERT...ON DUPLICATE KEY UPDATE有效。

ALTER TABLE records ADD CONSTRAINT tb_uq UNIQUE (p_id, c_id) 

WHERE子句是不需要的。

INSERT into records (name, value, p_id, c_id) 
VALUES ('Store', 'TX', 1188913, 1133) 
ON DUPLICATE KEY UPDATE value = 'TX' 
+0

只有這樣,圍繞它加入獨特的鑰匙,這是我的fear.Thanks – user2124871

+0

我能知道如何在SQL Server寫這個... – kasim

0

我有同樣的問題,可以在這裏找到答案。

Conditional duplicate key updates with MySQL

實際的答案是:WHERE條款並不在MySQL支持,你需要使用IF條件。

事情是這樣的:

INSERT INTO daily_events 
(created_on, last_event_id, last_event_created_at) 
VALUES 
('2010-01-19', 23, '2010-01-19 10:23:11') 
ON DUPLICATE KEY UPDATE 
last_event_id = IF(last_event_created_at < VALUES(last_event_created_at),  VALUES(last_event_id), last_event_id), 
last_event_created_at = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_created_at), last_event_created_at);