请教mysql一个sql语句,存在则更新,不存在则插入

时间:2022-12-31 00:07:51
多线程下的更新,一下子不知道怎么做了....
表:user
字段:
userid  -- 主键
username
ip
address....

现在user表里有记录,我设置了唯一性索引,是两个字段 "username" 和 “ip”
当插入数据的时候,如果存在一条记录,他们的 "username" 和 “ip”相同的话,那么就更新userid和address,否则插入新的数据,userid是自增的。

我试过replace into,这个他只会判断主键userid,而当我插入数据的时候是不知道userid的,所以总是变成新增数据。
也试过ON DUPLICATE KEY UPDATE 但是这个也是只识别userid,完全不起作用。

能否用sql语句实现这个功能?且保证整个操作原子性,这样就不需要程序的代码去处理了。

谢谢!!

5 个解决方案

#1


MYSQL提供了专门的语句

insert into .. on duplicate ....
replace ...


参考一下MYSQL免费官方手册中这两个SQL语句的语法说明和例子。

#2


引用 1 楼 ACMAIN_CHM 的回复:
MYSQL提供了专门的语句

insert into .. on duplicate ....
replace ...


参考一下MYSQL免费官方手册中这两个SQL语句的语法说明和例子。


能否指点详细些,我看了一下午这两个语句,看到的都是针对主键而已。像我说的,针对的是两个字段的唯一性,不知怎么办
谢谢!

#3


唯一字段也适用

#4


CREATE TABLE `test` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Index` int(4) NOT NULL DEFAULT '0',
  `IntVal` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`Id`),
  UNIQUE KEY `Index` (`Index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into test(`Id`, `Index`, `IntVal` ) values ( 1, 1, 2 );
insert into test(`Id`, `Index`, `IntVal` ) values ( 2, 1, 2 ) ON DUPLICATE KEY UPDATE IntVal=10;

你试下看看 我是5.5的版本 没什么问题

#5


create table userList(
id int not null primary key auto_increment,
openId varchar(50) not null,
nickName varchar(80) not null,
avatarUrl varchar(200) not null,
gender tinyint not null,
language varchar(50) not null,
city varchar(50) not null,
province varchar(50) not null,
country varchar(20),
cretime timestamp not null default CURRENT_TIMESTAMP,
CONSTRAINT uc_userListID UNIQUE(openId)
)ENGINE=myisam DEFAULT CHARSET=utf8;
INSERT INTO userList (avatarUrl,nickName,gender,language,city,province) VALUES ('xxxxxx','rocky',1,'zh-cn','shanghai','123') ON DUPLICATE KEY UPDATE avatarUrl='xxxxxx', nickName='rocky', gender=1,city='123';

#1


MYSQL提供了专门的语句

insert into .. on duplicate ....
replace ...


参考一下MYSQL免费官方手册中这两个SQL语句的语法说明和例子。

#2


引用 1 楼 ACMAIN_CHM 的回复:
MYSQL提供了专门的语句

insert into .. on duplicate ....
replace ...


参考一下MYSQL免费官方手册中这两个SQL语句的语法说明和例子。


能否指点详细些,我看了一下午这两个语句,看到的都是针对主键而已。像我说的,针对的是两个字段的唯一性,不知怎么办
谢谢!

#3


唯一字段也适用

#4


CREATE TABLE `test` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Index` int(4) NOT NULL DEFAULT '0',
  `IntVal` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`Id`),
  UNIQUE KEY `Index` (`Index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into test(`Id`, `Index`, `IntVal` ) values ( 1, 1, 2 );
insert into test(`Id`, `Index`, `IntVal` ) values ( 2, 1, 2 ) ON DUPLICATE KEY UPDATE IntVal=10;

你试下看看 我是5.5的版本 没什么问题

#5


create table userList(
id int not null primary key auto_increment,
openId varchar(50) not null,
nickName varchar(80) not null,
avatarUrl varchar(200) not null,
gender tinyint not null,
language varchar(50) not null,
city varchar(50) not null,
province varchar(50) not null,
country varchar(20),
cretime timestamp not null default CURRENT_TIMESTAMP,
CONSTRAINT uc_userListID UNIQUE(openId)
)ENGINE=myisam DEFAULT CHARSET=utf8;
INSERT INTO userList (avatarUrl,nickName,gender,language,city,province) VALUES ('xxxxxx','rocky',1,'zh-cn','shanghai','123') ON DUPLICATE KEY UPDATE avatarUrl='xxxxxx', nickName='rocky', gender=1,city='123';