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 都不是唯一的。那我怎么解决这个问题呢?谢谢你的帮助!
答案 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;