仅当存在两个条件时才更新MySQL查询,否则插入(

时间:2012-01-10 10:35:00

标签: mysql sql

我有一张这样的桌子:

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 SOURCE = '默认'时更新,如果此情况不符合存在我想插入。我知道有重复键时的方法,但在此表 ID_USER 中, SOURCE 都不是唯一的。那我怎么解决这个问题呢?谢谢你的帮助!

3 个答案:

答案 0 :(得分: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');

答案 1 :(得分:1)

据我了解,如果已存在,则要更新现有对(user_id,source),否则插入新行。 (user_id,source)对在表中是唯一的。

那就是你需要a)为这对添加一个UNIQUE约束:

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

和b)按如下方式编写upsert查询(@user_id和@content是传递给查询的变量):

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

答案 2 :(得分:0)

您正在使用哪个版本的MySql ...如果它是5.0或更高版本,那么您可以使用

INSERT ON DUPLICATE KEY UPDATE

在这里进一步了解

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

这仅适用于MySQL 5.0+

示例:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;