文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


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

19.5.1.1 复制和 AUTO_INCREMENT

基于语句的 AUTO_INCREMENTLAST_INSERT_ID()TIMESTAMP 值的复制会受到以下异常的影响:

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

  • 向包含 AUTO_INCREMENT 列且该列不是复合主键的第一列的表中执行 INSERT 操作,对于基于语句的日志记录或复制来说是不安全的。这些语句被标记为不安全。(错误 #11754117,错误 #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 的问题”