#### 13.2.6.1 INSERT ... SELECT 语句

[](<>)[](<>)

```
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    {   SELECT ...
      | TABLE table_name
      | VALUES row_constructor_list
    }
    [ON DUPLICATE KEY UPDATE assignment_list]

value:
    {expr | DEFAULT}

value_list:
    value [, value] ...

row_constructor_list:
    ROW(value_list)[, ROW(value_list)][, ...]

assignment:
    col_name =
          value
        | [row_alias.]col_name
        | [tbl_name.]col_name
        | [row_alias.]col_alias

assignment_list:
    assignment [, assignment] ...
```

和[`插入...选择`](insert-select.html)，您可以快速将许多行从[`选择`](select.html)语句，可以从一个或多个表中选择。例如：

```
INSERT INTO tbl_temp2 (fld_id)
  SELECT tbl_temp1.fld_order_id
  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
```

从 MySQL 8.0.19 开始，您可以使用[`桌子`](table.html)代替的声明[`选择`](select.html)，如此处所示：

```
INSERT INTO ta TABLE tb;
```

`表 tb`相当于`选择 * 从 tb`.在将源表中的所有列插入目标表时很有用，并且不需要使用 WHERE 进行过滤。此外，来自的行[`桌子`](table.html)可以使用一列或多列排序`订购方式`，并且可以使用 a 限制插入的行数`限制`条款。有关详细信息，请参阅[第 13.2.12 节，“TABLE 语句”](table.html).

以下条件适用于[`插入...选择`](insert-select.html)声明，并且，除非另有说明，对于`插入...表格`还有：

-   指定`忽视`忽略会导致重复键违规的行。

-   目标表[`插入`](insert.html)声明可能会出现在`从`的条款[`选择`](select.html)查询的一部分，或作为由[`桌子`](table.html).但是，您不能在子查询中插入表并从同一个表中进行选择。

    当从同一个表中选择和插入时，MySQL 会创建一个内部临时表来保存来自[`选择`](select.html)然后将这些行插入到目标表中。但是，您不能使用`插入 t ... 选择 ... 从 t`什么时候`吨`是一个`暂时的`表，因为`暂时的`表不能在同一语句中引用两次。出于同样的原因，您不能使用`插入 t ... 表 t`什么时候`吨`是一个临时表。看[第 8.4.4 节，“MySQL 中的内部临时表使用”](internal-temporary-tables.html)， 和[第 B.3.6.2 节，“临时表问题”](temporary-table-problems.html).

-   `自动递增`列照常工作。

-   为了保证二进制日志可以用来重新创建原始表，MySQL 不允许并发插入[`插入...选择`](insert-select.html)要么`插入...表格`声明（见[第 8.11.3 节，“并发插入”](concurrent-inserts.html)）。

-   为了避免不明确的列引用问题，当[`选择`](select.html)和[`插入`](insert.html)引用同一个表，为每个表提供一个唯一的别名[`选择`](select.html)部分，并使用适当的别名限定该部分中的列名。

    这[`桌子`](table.html)语句不支持别名。

    您可以显式选择源表或目标表（或两者）的哪些分区或子分区（或两者）与`划分`表名后面的子句。什么时候`划分`与源表的名称一起使用[`选择`](select.html)语句的一部分，行仅从其分区列表中指定的分区或子分区中选择。什么时候`划分`与目标表的名称一起使用[`插入`](insert.html)语句的一部分，必须可以将所有选择的行插入到选项后面的分区列表中指定的分区或子分区中。否则，该`插入...选择`声明失败。有关更多信息和示例，请参阅[第 24.5 节，“分区选择”](partitioning-selection.html).

[`桌子`](table.html)不支持`划分`条款。

为了[`插入...选择`](insert-on-duplicate.html)陈述，见[第 13.2.6.2 节，“INSERT ... ON DUPLICATE KEY UPDATE 语句”](insert-on-duplicate.html)对于在该条件下[`选择`](select.html)列可以参考`重复密钥更新`条款。这也适用于`插入...表格`.

一个顺序[`选择`](select.html)要么[`桌子`](table.html)没有的声明`订购方式`子句返回的行是不确定的。这意味着，当使用复制时，不能保证这样的[`选择`](select.html)在源和副本上以相同的顺序返回行，这可能导致它们之间的不一致。为防止这种情况发生，请始终写`插入...选择`要么`插入...表格`要使用复制的语句`订购方式`子句在源和副本上产生相同的行顺序。也可以看看[第 17.5.1.18 节，“复制和限制”](replication-features-limit.html).

由于这个问题，[`插入 ... 选择重复键更新`](insert-on-duplicate.html)和[`插入忽略...选择`](insert-select.html)对于基于语句的复制，语句被标记为不安全。此类语句在使用 statement-based 模式时会在错误日志中产生警告，并在使用时使用 row-based 格式写入二进制日志`混合`模式。（错误 #11758262、错误 #50439）

也可以看看[第 17.2.1.1 节，“基于语句和基于行的复制的优缺点”](replication-sbr-rbr.html).
