基于语句的 AUTO_INCREMENT、LAST_INSERT_ID() 和 TIMESTAMP 值的复制会受到以下异常的影响:
调用触发器或函数导致更新
AUTO_INCREMENT列的语句,使用基于语句的复制无法正确复制。这些语句被标记为不安全。(错误 #45677)向包含
AUTO_INCREMENT列且该列不是复合主键的第一列的表中执行INSERT操作,对于基于语句的日志记录或复制来说是不安全的。这些语句被标记为不安全。(错误 #11754117,错误 #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;