2012-01-10 46 views
1

我有這樣的一個表:更新查詢,只有當兩個條件存在,否則插入(

ID ID_USER SOURCE CONTENT 

或者只是:

CREATE TABLE `p_l_0215` (
    `id` bigint(20) NOT NULL auto_increment, 
    `id_user` bigint(20) NOT NULL, 
    `source` varchar(50) NOT NULL, 
    `content` text NOT NULL, 
    KEY `id` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; 

我想更新時ID_USER = Value1 and SOURCE = 'default'如果這個條件不存在我想插入我知道的方法,當ih ave一個重複密鑰,但在此表中ID_USER既不消息來源可能是唯一的。那我該如何解決這個問題?謝謝你的幫助!

+2

到目前爲止你做了什麼? – 2012-01-10 10:38:55

+0

但在表中是唯一的(user_id,source)? – newtover 2012-01-10 14:03:53

+0

@ newtover是的,他們是 – DomingoSL 2012-01-10 14:07:57

回答

1

1)創建過程

delimiter // 
CREATE PROCEDURE smartInsert(given_id_user bigint(20),given_source varchar(50), given_content text) 
BEGIN 

IF (EXISTS(SELECT * FROM p_l_0215 WHERE `id_user`=given_id_user AND `source`=given_source)) 
THEN 
    UPDATE p_l_0215 SET `content`=given_content WHERE `id_user`=given_id_user AND `source`=given_source; 
ELSE 
     INSERT INTO p_l_0215 VALUES (null, given_id_user, given_source, given_content); 
END IF; 
END// 
delimiter ; 

2)然後就這樣稱呼它CALL smartInsert(13, 'some_source', 'some content');

+0

有一個systax埃羅但我可以看到它在哪裏: 查詢SQL: IF( SELECT標識 FROM p_l_0215 WHERE id_user = '值1' 和源= '默認')= NULL THEN INSERT INTO p_l_0215(ID,id_user,來源,內容) VALUES( NULL, '值1',「默認','content' ); Messaggio di MySQL: #1064 - 您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以找到在第1行的IF(SELECT id FROM p_l_0215 WHERE id_user ='Value1'AND source ='default')= N'時使用的正確語法 – DomingoSL 2012-01-10 11:24:42

+0

它不應該* * source ='default')= N ... **它應該是** source ='default')IS NULL ... ** – redmoon7777 2012-01-10 11:27:56

+0

我也改變了,但是相同的語法錯誤,任何其他想法? – DomingoSL 2012-01-10 11:30:07

1

據我瞭解,你要更新現有的對(USER_ID,源),如果它已經存在,否則插入一個新行。 (user_id,source)對在整個表中是唯一的。

這是你需要一個)來添加UNIQUE約束的對:

ALTER TABLE `yourtable` 
    ADD UNIQUE INDEX `unique_user_source` USING BTREE(`ID_USER`, `SOURCE`); 

和b)以如下(@user_id和@content是變量,你傳遞給查詢寫UPSERT查詢):

INSERT INTO yourtable (ID_USER, CONTENT) 
    VALUES(@user_id, @content) 
ON DUPLICATE KEY UPDATE 
    CONTENT = VALUES(CONTENT);