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

仅当存在两个条件时更新MySQL上的查询,否则插入(,mysql,sql,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 C

我有一张这样的桌子:

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='default'时进行更新。我知道当我有一个重复的密钥时的方法,但是在这个表中,ID_USER和SOURCE都不能是唯一的。那么我如何解决这个问题呢?谢谢您的帮助!

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

INSERT ON DUPLICATE KEY UPDATE
再看看这里

这仅适用于MySQL 5.0+

例如:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
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然后像调用smartInsert13一样调用它,'some_source','some content'

据我所知,您希望更新现有的对user_id,source(如果已经存在),否则插入新行。user_id,source对在整个表中是唯一的

也就是说,您需要为该对添加唯一约束:

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);

有一个systax错误,但我可以看到它的位置:查询SQL:如果从p_l_0215中选择id,其中id_user='Value1'和source='default'=NULL,然后插入p__0215 id,id_user,source,content VALUES NULL,'Value1','default',content';Messaggio di MySQL:1064-您的SQL语法中有错误;请检查手册,确认对应于您的MySQL服务器版本,以便使用正确的语法near'IF SELECT id FROM p_l_0215,其中id_user='Value1'和source='default'=N'在第1行,它不应该是source='default'=N…它应该是source='default'为NULL…我也改变了这一点,但是相同的语法错误,还有其他想法吗?非常抱歉,我们刚刚回家。不管怎样,这个过程还没有成功?没有,它说IF语句有一个错误,我真的不知道问题出在哪里,如果我只执行SELECT语句,如果我只执行INSERT语句,如果我只执行UPDATE语句,它就行了!!!但是孔代码给出了我和错误,检查这个屏幕截图:但是pairs用户id,sou吗rce在整个表中是唯一的?然后在对上添加一个唯一的约束,并在重复密钥更新时使用insert,这应该在这种情况下使用cases@newtover你能告诉我怎么做吗?当没有用户id、DEFAULTsource对时,我实际上不明白你要插入什么?还有其他值吗?你能更具体一点吗?@newtover I如果你检查一下,redmoon7777给出的答案正是我所需要的,但仍然有效。