?? mysql insert into select使用方法详解|三体亚博国际开户 亚博国际开户,亚博体育在线app,亚博体育正规
文章目录

mysql insert into select使用方法详解

我们先来看看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使用行级锁定)的表,不会发生这种情况?。

本文网址:http://www.santii.com/article/158.html

?
数据更新时间:2019-08-11