文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  复制和 AUTO_INCREMENT

19.5.1.1 复制和 AUTO_INCREMENT

基于语句的复制 AUTO_INCREMENTLAST_INSERT_ID()TIMESTAMP 值的复制,需要遵守以下例外情况

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

  • 向包含 AUTO_INCREMENT 列的复合主键的表中执行 INSERT 操作,如果该列不是复合主键中的第一列,则对于基于语句的日志记录或复制来说是不安全的。这些语句被标记为不安全。(Bug #11754117, Bug #45670)

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

  • 使用 ALTER TABLE 向表中添加 AUTO_INCREMENT 列,可能无法在副本和源上产生相同的行排序。这是因为行编号的顺序取决于用于表的特定存储引擎以及插入行的顺序。如果源和副本上的顺序必须相同,则必须在分配 AUTO_INCREMENT 编号之前对行进行排序。假设您想向具有 col1col2 列的表 t1 添加 AUTO_INCREMENT 列,以下语句将生成一个与 t1 相同的新表 t2,但包含 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 也被忽略。如果表定义包含任何这些特征,请使用与创建 t1 所使用的语句相同的 CREATE TABLE 语句创建 t2,但添加 AUTO_INCREMENT 列。

    无论使用哪种方法来创建和填充包含 AUTO_INCREMENT 列的副本,最后一步是删除原始表,然后重命名副本

    DROP t1;
    ALTER TABLE t2 RENAME t1;

    另请参阅 第 B.3.6.1 节“ALTER TABLE 问题”