基于语句的复制 AUTO_INCREMENT
、LAST_INSERT_ID()
和 TIMESTAMP
值遵循以下异常:
-
触发器或函数更新
AUTO_INCREMENT
列的语句不能正确地使用基于语句的复制。这些语句被标记为不安全的。(Bug #45677) -
将数据插入到具有复合主键的表中,其中
AUTO_INCREMENT
列不是该复合主键的第一个列时,不安全的语句将被标记为不安全的。(Bug #11754117, Bug #45670)这并不影响使用
InnoDB
存储引擎的表,因为 InnoDB 表具有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;
Important为了确保源和副本上的相同顺序,
ORDER BY
子句必须命名t1
的所有列。刚刚给出的说明受
CREATE TABLE ... LIKE
的限制:外键定义被忽略,同样忽略了DATA DIRECTORY
和INDEX DIRECTORY
表选项。如果表定义包含任何这些特征,请使用CREATE TABLE
语句创建t2
,该语句与创建t1
的语句相同,但添加了AUTO_INCREMENT
列。无论使用何种方法创建和填充具有
AUTO_INCREMENT
列的副本,最后一步是删除原始表并重命名副本:DROP t1; ALTER TABLE t2 RENAME t1;