2012-01-10 48 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);