AUTO_INCREMENT
、
LAST_INSERT_ID()
和
值
的基于语句的复制
TIMESTAMP
已正确完成,但有以下例外情况:
在 MySQL 5.7.1 之前使用基于语句的复制
AUTO_INCREMENT
时,副本上表中的列必须与源上的相同列匹配;也就是说,AUTO_INCREMENT
列必须被复制到AUTO_INCREMENT
列。AUTO_INCREMENT
使用基于语句的复制无法正确复制 调用导致列更新的触发器或函数的语句。这些语句被标记为不安全的。(漏洞 #45677)Into
INSERT
具有复合主键的表中包含的AUTO_INCREMENT
列不是此复合键的第一列对于基于语句的日志记录或复制来说是不安全的。这些语句被标记为不安全的。(缺陷 #11754117,缺陷 #45670)此问题不会影响使用
InnoDB
存储引擎的InnoDB
表,因为具有 AUTO_INCREMENT 列的表至少需要一个键,其中自动增量列是唯一或最左边的列。向表中添加一
AUTO_INCREMENT
列ALTER TABLE
可能不会在副本和源上产生相同的行排序。发生这种情况是因为行的编号顺序取决于用于表的特定存储引擎和插入行的顺序。如果源和副本上的顺序相同很重要,则必须在分配AUTO_INCREMENT
数字之前对行进行排序。假设您要向包含列 andAUTO_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 DIRECTORY
和INDEX DIRECTORY
表选项也是如此。如果表定义包含任何这些特征,则使用与用于创建t2
的CREATE TABLE
语句相同的语句创建t1
,但添加了AUTO_INCREMENT
列。无论使用何种方法创建和填充具有该
AUTO_INCREMENT
列的副本,最后一步是删除原始表,然后重命名副本:DROP t1; ALTER TABLE t2 RENAME t1;