19.5.1.1 复制和AUTO_INCREMENT
基于语句的复制AUTO_INCREMENT
、LAST_INSERT_ID()
和TIMESTAMP
值的语句是根据以下限制进行的:
-
调用触发器或函数的语句,该语句更新了
AUTO_INCREMENT
列的语句,不会被正确地复制使用基于语句的复制。这些语句被标记为不安全。(Bug #45677) -
将插入一个包含复合主键的表,其中包括一个
AUTO_INCREMENT
列,但不是该主键的第一个列,这些语句不安全。(Bug #11754117,Bug #45670)这个问题不影响使用
InnoDB
存储引擎的表,因为InnoDB表中AUTO_INCREMENT
列需要至少一个键,其中AUTO_INCREMENT
列是唯一的或最左侧的列。 -
将
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;