16.4.1.1 复制和 AUTO_INCREMENT

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

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

  • 不能使用基于语句的复制正确复制调用触发器或函数导致对AUTO_INCREMENT列进行更新的语句。这些语句被标记为不安全。错误 45677)

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

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

  • 将具有AUTO_INCREMENT的列添加到具有ALTER TABLE的 table 中可能不会对副本数据库和源数据库上的行产生相同的 Sequences。发生这种情况的原因是,行的编号 Sequences 取决于用于 table 的特定存储引擎以及行的插入 Sequences。如果在源和副本上具有相同的 Sequences 很重要,则在分配AUTO_INCREMENT号之前必须对行进行排序。假设要向具有col1col2列的 tablet1添加AUTO_INCREMENT列,以下语句将生成与t1相同但具有AUTO_INCREMENT列的新 tablet2
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;

Important

为了保证源和副本上的 Sequences 相同,ORDER BY子句必须命名t1的* all *列。

刚刚给出的说明受创建 table...喜欢的限制:外键定义将被忽略,DATA DIRECTORYINDEX DIRECTORYtable 选项也将被忽略。如果 table 定义包含任何这些 Feature,请使用CREATE TABLE语句创建t2,该语句与用于创建t1的语句相同,但增加AUTO_INCREMENT列。

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

DROP t1;
ALTER TABLE t2 RENAME t1;

另请参见第 B.4.6.1 节“ ALTER TABLE 的问题”