4.1.1复制和AUTO_INCREMENT

Statement-based复制AUTO_INCREMENTLAST_INSERT_ID (),时间戳值的执行有以下例外情况:

  • 调用触发器或函数的语句,导致对AUTO_INCREMENT没有使用基于语句的复制正确地复制列。这些语句被标记为不安全。(错误# 45677)

  • 一个插入插入具有复合主键的表,该复合主键包括AUTO_INCREMENT不是此复合键的第一列的列对于基于语句的日志记录或复制是不安全的。这些语句被标记为不安全。(Bug #11754117, Bug #45670)

    的表不受此问题的影响InnoDB存储引擎,自从InnoDB表与一个AUTO_INCREMENT列需要至少一个键,其中自动递增列是唯一或最左边的列。

  • 添加一个AUTO_INCREMENT列到表ALTER TABLE可能不会产生副本和源上相同的行顺序。出现这种情况是因为行编号的顺序取决于表使用的特定存储引擎和插入行的顺序。如果源和副本具有相同的顺序很重要,则必须在分配AUTO_INCREMENT号码。假设你想加一个AUTO_INCREMENT列到表t1这列col1col2,下面的语句将生成一个新表t2相同的t1但有一个AUTO_INCREMENT专栏:

    像t1一样创建表t2ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARY KEY;INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;
    重要的

    为了保证源和副本上的顺序相同,命令条款必须名字所有t1

    刚才给出的指示受限于创建表……就像:外键定义将被忽略数据目录索引目录表选择。如果表定义包含任何这些特征,则创建t2使用一个创建表语句,该语句与用于创建的语句相同t1,但是加上了AUTO_INCREMENT列。

    无论用于创建和填充具有AUTO_INCREMENT列,最后一步是删除原始表,然后重命名副本:

    t1下降;ALTER TABLE t2 RENAME t1

    另请参阅ALTER TABLE的问题