Documentation Home

16.4.1.1 复制和 AUTO_INCREMENT

AUTO_INCREMENTLAST_INSERT_ID()和 值 的基于语句的复制 TIMESTAMP已正确完成,但有以下例外情况:

  • 在 MySQL 5.7.1 之前使用基于语句的复制 AUTO_INCREMENT时,副本上表中的列必须与源上的相同列匹配;也就是说, AUTO_INCREMENT列必须被复制到AUTO_INCREMENT列。

  • AUTO_INCREMENT使用基于语句的复制无法正确复制 调用导致列更新的触发器或函数的语句。这些语句被标记为不安全的。(漏洞 #45677)

  • IntoINSERT具有复合主键的表中包含的 AUTO_INCREMENT列不是此复合键的第一列对于基于语句的日志记录或复制来说是不安全的。这些语句被标记为不安全的。(缺陷 #11754117,缺陷 #45670)

    此问题不会影响使用 InnoDB存储引擎的 InnoDB表,因为具有 AUTO_INCREMENT 列的表至少需要一个键,其中自动增量列是唯一或最左边的列。

  • 向表中添加一AUTO_INCREMENTALTER TABLE可能不会在副本和源上产生相同的行排序。发生这种情况是因为行的编号顺序取决于用于表的特定存储引擎和插入行的顺序。如果源和副本上的顺序相同很重要,则必须在分配 AUTO_INCREMENT数字之前对行进行排序。假设您要向包含列 andAUTO_INCREMENT的表添加一列,以下语句生成一个 与t1col1col2t2t1但有一AUTO_INCREMENT列:

    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;
    重要的

    为了保证源和副本上的相同顺序,该ORDER BY子句必须命名 的所有t1

    刚刚给出的说明受到以下限制CREATE TABLE ... LIKE:外键定义被忽略,DATA DIRECTORYINDEX DIRECTORY表选项也是如此。如果表定义包含任何这些特征,则使用与用于创建 t2CREATE TABLE语句相同的语句创建t1,但添加了AUTO_INCREMENT列。

    无论使用何种方法创建和填充具有该AUTO_INCREMENT列的副本,最后一步是删除原始表,然后重命名副本:

    DROP t1;
    ALTER TABLE t2 RENAME t1;

    另见第 B.3.6.1 节,“ALTER TABLE 的问题”