mysql insert or update

2018-08-09  本文已影响0人  bearPotMan

在某些业务场景中,我们可能会有这样一种需求(很难受的是我还没有遇到):

insert一条数据的时候,如果主键已经存在,就执行update,否则的话就执行insert

mysql研发人员可能早就料到你会有这种骚操作,on duplicate key update(有重复key时更新)就可以解决你的这一痛点。
下面我们举一个例子:

1、首先创建需要的数据库以及表

mysql> create database test charset utf8mb4 collate utf8mb4_0900_ai_ci;
Query OK, 1 row affected (0.09 sec)
mysql> use test;
Database changed
mysql> CREATE TABLE `p_user` (
  `id` varchar(32) NOT NULL COMMENT '用户表',
  `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `age` int(3) DEFAULT '18' COMMENT '年龄',
  `create_time` date DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Query OK, 0 rows affected (0.15 sec)

注意: 创建表的时候是指定了主键列的。我们不使用MySQL的自增方式,而是自己来生成主键列的值,比如使用UUID

2、执行第一条insert语句

mysql> insert into p_user (id,name,age,create_time) values ('jiush237ytusx6sse52232','bearpotman',24,now());
Query OK, 1 row affected, 1 warning (0.09 sec)
mysql> select * from p_user;
+------------------------+------------+------+-------------+
| id                     | name       | age  | create_time |
+------------------------+------------+------+-------------+
| jiush237ytusx6sse52232 | bearpotman |   24 | 2018-08-09  |
+------------------------+------------+------+-------------+
1 row in set (0.00 sec)

3、执行第二条insert语句(与上一条语句的主键值相同,修改其他值)

mysql> insert into p_user (id,name,age,create_time) values ('jiush237ytusx6sse52232','bpm',20,now());
ERROR 1062 (23000): Duplicate entry 'jiush237ytusx6sse52232' for key 'PRIMARY'

我们会发现当我们执行该条insert语句时就会报错,因为主键值重复了。ok,那有没有这种可能:如果主键值重复了,那么就执行更新操作,而不是报错。接下来就是今天的重头戏

4、执行第二条insert语句时加上on duplicate key update

mysql> insert into p_user (id,name,age,create_time) values ('jiush237ytusx6sse52232','bpm',24,now()) on duplicate key update name='bpm',age=20,create_time=now();
Query OK, 2 rows affected, 2 warnings (0.06 sec)
mysql> select * from p_user;
+------------------------+------+------+-------------+
| id                     | name | age  | create_time |
+------------------------+------+------+-------------+
| jiush237ytusx6sse52232 | bpm  |   20 | 2018-08-09  |
+------------------------+------+------+-------------+
1 row in set (0.00 sec)

执行成功!
ok,今天的分享结束啦!

我是bearPotMan,一个经验不足的十八线演(码)员(农)。
Know everything,control everything!

上一篇 下一篇

猜你喜欢

热点阅读