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

17.4.1.1 Replication and AUTO_INCREMENT

原创 由迪 2020-04-01
553

基于语句的复制 AUTO_INCREMENT, LAST_INSERT_ID()和 TIMESTAMP值是正确,符合以下情况除外:

在MySQL 5.6.10之前使用基于语句的复制AUTO_INCREMENT时,从服务器上表中的列必须与主服务器上的列匹配;也就是说,AUTO_INCREMENT必须将AUTO_INCREMENT列复制到列。(缺陷号12669186)

AUTO_INCREMENT使用基于语句的复制无法正确复制 调用触发器或函数导致更新列的语句。在MySQL 5.6中,此类语句被标记为不安全。错误45677)

一个INSERT成具有包括一个复合主键的表 AUTO_INCREMENT列,它是不该组合键的第一列不是基于语句的记录或复制的安全。从MySQL 5.6.6开始,此类语句被标记为不安全。(缺陷#11754117,错误#45670)

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

在AUTO_INCREMENT表中添加列ALTER TABLE可能与在从属服务器和主服务器上产生的行顺序不同。发生这种情况的原因是,行的编号顺序取决于用于表的特定存储引擎以及行的插入顺序。如果在主站和从站上具有相同的顺序很重要,则在分配AUTO_INCREMENT编号之前必须对行进行排序 。假设要向具有和的AUTO_INCREMENT列的表t1中 添加一列,以下语句将生成一个新表,该表 与相同,但带有col1col2t2t1AUTO_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 DIRECTORY以及和 INDEX DIRECTORY表选项均被忽略。如果表定义包含这些特征中的任何t2一个CREATE TABLE,则使用与创建时 使用的语句相同的语句进行创建t1,但增加一AUTO_INCREMENT列。

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

DROP t1;
ALTER TABLE t2 RENAME t1;
另请参见第B.4.6.1节“ ALTER TABLE的问题”。

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

评论