INSERT语句是最常见的SQL语句之一,MySQL中INSERT有其他形态的插入数据方式。下面了解一下mysql中常用的四种插入数据的语句:
INSERT INTO
1.insert into表示插入数据,数据库会检查主键(PrimaryKey),如果出现重复会报错;除了这个之外还有一些配合的参数.
语法如下:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
[ON DUPLICATE KEY UPDATE assignment_list]
- DELAYED:是立刻返回一个标识,告诉上层程序,数据已经插入了,当表没有被其它线程使用时,此行被插入,真实插入时间就不可控了。所以这样的写法对数据的安全性是没有保障的。 延迟插入和替换在MySQL 5.6中是不推荐的。在MySQL 5.7,MySQL 8.0中,不支持延迟。服务器识别但忽略DELAYED关键字,将插入处理为非延迟插入,并生成erwarnlegacysyntaxconvert警告(“不再支持延迟插入”)。语句被转换为INSERT”)。DELAYED关键字计划在未来的版本中删除。
- LOW_PRIORITY:插入的执行将被延迟,直到没有其他客户端从表中读取数据。这包括在现有客户端正在读取时以及INSERT LOWPRIORITY语句正在等待时开始读取的其他客户端。因此,对于发出INSERT LOWPRIORITY语句的客户机,可能要等待很长时间。 LOWPRIORITY只影响只使用表级锁的存储引擎(如MyISAM、内存和合并)。 LOWPRIORITY通常不应该用于MyISAM表,因为这样做会禁用并发插入
- HIGH_PRIORITY:如果指定了HIGHPRIORITY,同时服务器采用–low-priority-updates选项启动,则HIGHPRIORITY将覆盖–low-priority-updates选项。这么做还会导 致同时进行的插入被取消。 【 lowpriorityupdates:如果设置为1,所有插入、更新、删除和锁表写语句都将等待,直到受影响的表上没有未决的选择或锁表读取。使用{INSERT | REPLACE | DELETE | UPDATE} LOW_PRIORITY…仅降低一个查询的优先级。这个变量只影响只使用表级锁的存储引擎(如MyISAM、MEMORY和MERGE)mysql的merge引擎类型允许把许多结构相同的表合并为一个表,Merge表有点类似于视图。】
- IGNORE:insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据,主键和唯一键为基准;
mysql> insert ignore tinsert(id,name) values(3,'D');
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+---------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------+
| Warning | 1062 | Duplicate entry '3' for key 'PRIMARY' |
+---------+------+---------------------------------------+
INSERT INTO SELECT
把一张表的字段数据导入到另一张表中,执行语句会把整个数据会打包成一个事务执行。
注意:当从同一个表中选择和插入时,MySQL创建一个内部临时表来保存SELECT中的行,然后将这些行插入到目标表中。但是,不能使用INSERT INTO t…选择……当t是临时表时,从t开始,因为临时表不能在同一语句中被引用两次
REPLACE INTO
replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中,
- 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据;
- 否则,直接插入新数据;
- REPLACE,您必须同时拥有表的INSERT,UPDATE,DELETE权限。
语法:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
注意:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。
1.下面看看binlog 解析:主键和唯一键同事存在的时候语句不一样。
主键:是进行update操作。
主键+唯一键:delete+insert操作
2.但对于同一个数据所有行都一样的时候replace into就不会进行更新操作。
INSERT INTO ON DUMPLICATE KEY UPDATE
...
✨ 接下来内容请访问原文(https://www.modb.pro/db/28662?YYF)进行查看~
更多数据库相关内容,可访问墨天轮(https://www.modb.pro/?YYF)进行浏览。