MySQL insert
Posted 丹柿小院
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL insert相关的知识,希望对你有一定的参考价值。
向数据表中插入数据时,通常存在以下逻辑:
1)判断数据是否存在;
2)如果不存在,则插入;
3)如果存在,则进行其他处理。
因此在 insert 语法基础上,出现了其他语法,如:
on duplicate key update
replace
insert ignore
1 insert
1.1 概念
用于向已存在的表中插入新行。
基本语法如下所示。
INSERT
[INTO] tbl_name
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
如果数据已存在,insert语句将报错,如 duplicate-key error。
1.2 测试
查看表结构
mysql> desc t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(10) | NO | PRI | NULL | |
| a | int(10) | YES | UNI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
查看数据
mysql> select * from t limit 3 ;
+----+------+------+
| id | a | name |
+----+------+------+
| 1 | 1 | test |
| 2 | 2 | test |
| 3 | 3 | test |
+----+------+------+
3 rows in set (0.00 sec)
主键冲突,实际上这条SQL存在主键冲突与唯一键冲突。
mysql> insert into t (id,a,name) values(1,2,'test1');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
以下两种语法支持插入时避免唯一键冲突导致插入失败。
INSERT ... ON DUPLICATE KEY UPDATE,表示 插入 或 删除和插入;
replace,表示 插入 或 更新。
2 on duplicate key update
2.1 概念
INSERT ... ON DUPLICATE KEY UPDATE 用于解决重复性问题。
首先判断记录是否存在,存在时更新,不存在时插入。
因此重点在于判断记录是否存在。
判断标准是如果插入的记录导致一个唯一索引或主键重复,就认为该记录已存在。
根据受影响行数可以区分该语句实际上执行的是插入还是更新。
受影响行数为1,表明行作为新纪录插入;
受影响行数为2,表明行重复,原有记录被更新;
受影响行数为0,表明更新的数据与原数据一样,实际上未更新。
查询官方文档。
INSERT with an ON DUPLICATE KEY UPDATE clause enables existing rows to be updated if a row to be inserted would cause a duplicate value in a UNIQUE index or PRIMARY KEY.
2.2 测试
如下所示,依次执行 on duplicate key update a=values(a), name=values(name) 与 on duplicate key update a=values(a) 均执行失败,报错唯一键冲突。
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE t1 SET c=c+1 WHERE a=1;
For an InnoDB table where a is an auto-increment column, the INSERT statement increases the auto-increment value but the UPDATE does not.
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
如果 a=1 OR b=2 条件匹配多条记录,只有一条会被更新。
-
CURRENT_TIMESTAMP,适用于 insert 场景,写入后不变;
-
ON UPDATE CURRENT_TIMESTAMP,适用于 update 场景,其他字段变更时自动更新。
mysql> show create table t4 \G
*************************** 1. row ***************************
Table: t4
Create Table: CREATE TABLE `t4` (
`id` int(11) DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> insert into t4(id) values(1);
Query OK, 1 row affected (0.01 sec)
mysql>
mysql> select * from t4;
+------+---------------------+---------------------+
| id | create_time | update_time |
+------+---------------------+---------------------+
| 1 | 2021-07-30 14:38:23 | 2021-07-30 14:38:23 |
+------+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> update t4 set id=2 where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql>
mysql> select * from t4;
+------+---------------------+---------------------+
| id | create_time | update_time |
+------+---------------------+---------------------+
| 2 | 2021-07-30 14:38:23 | 2021-07-30 14:38:36 |
+------+---------------------+---------------------+
1 row in set (0.00 sec)
-
从表中删除重复的键值冲突的行;
-
再次尝试向表中插入新行。
-
受影响行数为1,表明行作为新纪录插入;
-
受影响行数大于1,表明行重复,原有记录被删除后插入;
REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.
If you use the IGNORE modifier, ignorable errors that occur while executing the INSERT statement are ignored. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted.
With IGNORE, the row is discarded and no error occurs. Ignored errors generate warnings instead.
-
replace 当记录不存在时insert,存在时先delete后insert。on duplicate key update 执行insert或update;
-
对于删除和添加操作,replace 需要重复维护索引,因此大批量更新时 replace 的性能低于 on duplicate key update;
-
三种语句的常见使用场景
-
ON DUPLICATE KEY UPDATE 用法与说明:https://blog.csdn.net/zyb2017/article/details/78449910
-
mysql INSERT ... ON DUPLICATE KEY UPDATE语句:https://blog.csdn.net/analogous_love/article/details/71085001
-
MySQL replace into 用法(insert into 的增强版):https://blog.csdn.net/risingsun001/article/details/38977797
-
INSERT Statement:https://dev.mysql.com/doc/refman/5.7/en/insert.html
-
REPLACE Statement:https://dev.mysql.com/doc/refman/5.7/en/replace.html
-
INSERT ... ON DUPLICATE KEY UPDATE Statement:https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html -
最清晰易懂的Mysql CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP区别:https://www.cnblogs.com/liangmingshen/p/11008544.html
以上是关于MySQL insert的主要内容,如果未能解决你的问题,请参考以下文章