Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Replication and AUTO_INCREMENT

19.5.1.1 复制和AUTO_INCREMENT

基于语句的复制AUTO_INCREMENTLAST_INSERT_ID()TIMESTAMP值的语句是根据以下限制进行的:

  • 调用触发器或函数的语句,该语句更新了AUTO_INCREMENT列的语句,不会被正确地复制使用基于语句的复制。这些语句被标记为不安全。(Bug #45677)

  • 将插入一个包含复合主键的表,其中包括一个AUTO_INCREMENT列,但不是该主键的第一个列,这些语句不安全。(Bug #11754117,Bug #45670)

    这个问题不影响使用InnoDB存储引擎的表,因为InnoDB表中AUTO_INCREMENT列需要至少一个键,其中AUTO_INCREMENT列是唯一的或最左侧的列。

  • AUTO_INCREMENT列添加到表中使用ALTER TABLE语句可能不会在源和副本中产生相同的行顺序。这是因为行的顺序取决于存储引擎和行的插入顺序。如果需要在源和副本中保持相同的顺序,必须在分配AUTO_INCREMENT号前对行进行排序。假设您想将AUTO_INCREMENT列添加到表t1中,该表包含列col1col2,以下语句将创建一个新的表t2,该表与t1相同,但具有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;
    Important

    为了在源和副本中保持相同的顺序,必须在ORDER BY子句中指定t1的所有列。

    上述指令受CREATE TABLE ... LIKE的限制:外键定义将被忽略,同样忽略DATA DIRECTORYINDEX DIRECTORY表选项。如果表定义包含这些特征,使用CREATE TABLE语句创建t2,该语句与用于创建t1的语句相同,但添加了AUTO_INCREMENT列。

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

    DROP t1;
    ALTER TABLE t2 RENAME t1;

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