大家好,又见面了,我是你们的朋友全栈君。
mysql insert into select使用方法详解2017-11-22 15:47
我们先来看看mysql insert into select的语法规则。
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[(col_name [, col_name] …)]
SELECT …
[ON DUPLICATE KEY UPDATE assignment_list]
value:
{expr | DEFAULT}
assignment:
col_name = value
assignment_list:
assignment [, assignment] …
使用INSERT INTO…SELECT,您可以根据SELECT语句的结果快速地将多行插入到表中,该语句可以从一个或多个表中进行选择。
例如:
INSERT INTO tbl_temp2 (fld_id)
SELECT tbl_temp1.fld_order_id
FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
以下条件适用于 INSERT INTO… SELECT声明:
指定IGNORE忽略会导致重复键违规的行。
DELAYED被忽略INSERT … SELECT。
该INSERT语句的目标表可能出现在查询部分的FROM子句中SELECT。但是,不能插入到表中并从子查询中的同一个表中进行选择。
在从同一个表中选择并插入时,MySQL创建一个内部临时表来存放来自这些表的行SELECT,然后将这些行插入到目标表中。但是,不能使用INSERT INTO t … SELECT … FROM t何时 t是TEMPORARY 表,因为TEMPORARY表不能在同一语句中引用两次。
AUTO_INCREMENT 列照常工作。
为确保二进制日志可用于重新创建原始表,MySQL不允许并发插入INSERT … SELECT语句。
为避免SELECT在INSERT引用同一个表时引用不明确的列引用问题 , 请为该SELECT部分中使用的每个表提供唯一的别名,并使用适当的别名限定该部分中的列名。
SELECT没有ORDER BY子句的语句返回行 的顺序是不确定的。这意味着,在使用复制时,不能保证这样的SELECT返回在主服务器和从服务器上的顺序相同,这可能会导致它们之间的不一致。
为防止发生这种情况,请始终INSERT… SELECT使用ORDER BY 在主服务器和从服务器上生成相同行顺序的子句编写要复制的语句。
由于这个问题,在MySQL 5.5.18中, INSERT…SELECT ON DUPLICATE KEY UPDATE和INSERT IGNORE… SELECT语句被标记为不安全的基于语句的复制。
这些语句在使用基于语句的模式时会在错误日志中产生警告,并在使用MIXED模式时使用基于行的格式写入二进制日志 。(错误#11758262,错误#50439)
INSERT INTO SELECT影响使用诸如MyISAM使用表级锁的存储引擎的分区表 的语句 会锁定源表和目标表的所有分区。对于使用存储引擎(如InnoDB使用行级锁定)的表,不会发生这种情况 。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159642.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...