MySQL 8.0参考手册
MySQL 8.0版本说明
Statement-based复制AUTO_INCREMENT
,LAST_INSERT_ID ()
,时间戳
值的执行有以下例外情况:
调用触发器或函数的语句,导致对
AUTO_INCREMENT
没有使用基于语句的复制正确地复制列。这些语句被标记为不安全。(错误# 45677)一个
插入
插入具有复合主键的表,该复合主键包括AUTO_INCREMENT
不是此复合键的第一列的列对于基于语句的日志记录或复制是不安全的。这些语句被标记为不安全。(Bug #11754117, Bug #45670)的表不受此问题的影响
InnoDB
存储引擎,自从InnoDB
表与一个AUTO_INCREMENT列需要至少一个键,其中自动递增列是唯一或最左边的列。添加一个
AUTO_INCREMENT
列到表ALTER TABLE
可能不会产生副本和源上相同的行顺序。出现这种情况是因为行编号的顺序取决于表使用的特定存储引擎和插入行的顺序。如果源和副本具有相同的顺序很重要,则必须在分配AUTO_INCREMENT
号码。假设你想加一个AUTO_INCREMENT
列到表t1
这列col1
和col2
,下面的语句将生成一个新表t2
相同的t1
但有一个AUTO_INCREMENT
专栏:像t1一样创建表t2ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARY KEY;INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;
重要的为了保证源和副本上的顺序相同,
命令
条款必须名字所有列t1
.刚才给出的指示受限于
创建表……就像
:外键定义将被忽略数据目录
和索引目录
表选择。如果表定义包含任何这些特征,则创建t2
使用一个创建表
语句,该语句与用于创建的语句相同t1
,但是加上了AUTO_INCREMENT
列。无论用于创建和填充具有
AUTO_INCREMENT
列,最后一步是删除原始表,然后重命名副本:t1下降;ALTER TABLE t2 RENAME t1
另请参阅ALTER TABLE的问题.