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!