Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 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 列至少需要一个键,其中自动递增列是唯一或最左侧的列。

  • 使用 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 问题”