暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[ACDU翻译] MySQL 17.5.1.1 复制和 AUTO_INCREMENT

原创 由迪 2022-10-24
271

执行基于语句的、 和 值 复制 AUTO_INCREMENT, 但有以下例外情况:LAST_INSERT_ID()TIMESTAMP

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

  • INSERT进入具有复合主键的表中包含的 列AUTO_INCREMENT不是该复合键的第一列,对于基于语句的日志记录或复制来说是不安全的。这些语句被标记为不安全。(错误 #11754117、错误 #45670)

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

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

    重要的

    为了保证源和副本的顺序相同,子句ORDER BY必须 命名. t1

    刚刚给出的说明受到以下限制CREATE TABLE ... LIKE: 外键定义被忽略,DATA DIRECTORYINDEX DIRECTORYtable 选项也是如此。如果表定义包含任何这些特征,请使用与用于创建 t2CREATE TABLE语句相同的语句进行创建t1,但添加了AUTO_INCREMENT列。

    不管用于创建和填充具有该AUTO_INCREMENT列的副本的方法如何,最后一步是删除原始表,然后重命名该副本:

    DROP t1; ALTER TABLE t2 RENAME t1;

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论