#### 17.5.1.1 复制和自动\_增量

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

基于语句的复制`自动递增`,[`LAST_INSERT_ID()`](information-functions.html#function_last-insert-id)， 和[`时间戳`](datetime.html)除以下例外情况外，执行值：

-   调用触发器或函数的语句会导致更新`自动递增`未使用基于语句的复制正确复制列。这些语句被标记为不安全。（错误 #45677）

-   一个[`插入`](insert.html)到具有复合主键的表中，其中包括`自动递增`不是此复合键第一列的列对于基于语句的日志记录或复制是不安全的。这些语句被标记为不安全。（错误 #11754117、错误 #45670）

    此问题不影响使用[`InnoDB`](innodb-storage-engine.html)存储引擎，因为`InnoDB`表与[汽车\_增量](glossary.html#glos_auto_increment)column 需要至少一个键，其中自动增量列是唯一的或最左边的列。

-   添加一个`自动递增`列到一个表[`更改表`](alter-table.html)可能不会在副本和源上产生相同的行顺序。发生这种情况是因为行编号的顺序取决于用于表的特定存储引擎以及插入行的顺序。如果在源和副本上具有相同的顺序很重要，则必须在分配之前对行进行排序`自动递增`数字。假设您要添加一个`自动递增`列到表`t1`有列的`col1`和`col2`，以下语句生成一个新表`t2`相同`t1`但有一个`自动递增`柱子：

    ```
    CREATE TABLE t2 LIKE t1;
    ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARY KEY;
    INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;
    ```

    重要的

    为了保证源和副本的顺序相同，`订购方式`子句必须命名*全部*列`t1`.

    刚刚给出的说明受以下限制[`创建表...喜欢`](create-table-like.html): 外键定义被忽略，`数据目录`和`索引目录`表选项。如果表定义包含任何这些特征，请创建`t2`用一个[`创建表`](create-table.html)与用于创建的语句相同的语句`t1`, 但加上`自动递增`柱子。

    无论使用何种方法创建和填充具有`自动递增`列，最后一步是删除原始表，然后重命名副本：

    ```
    DROP t1;
    ALTER TABLE t2 RENAME t1;
    ```

    也可以看看[第 B.3.6.1 节，“ALTER TABLE 的问题”](alter-table-problems.html).
