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