添加自增主键的逻辑:添加自增主键时,主键值是按表中数据的物理顺序分配的。主库按 (1,1)、(2,2) 顺序分配 id 为 1 和 2;从库按 (2,2)、(1,1) 顺序分配 id 为 1 和 2,导致主从 id 对应的数据行不一致。
三、解决办法
临时解决法(官方建议):通过新建表、排序插入数据来确保主从顺序一致,但表大时耗时且操作复杂。
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; -- 按固定顺序插入数据
DROP TABLE t1; RENAME TABLE t2 TO t1; -- 替换原表
根本预防法:在建表时强制要求有主键,避免后续问题。
MySQL 8.0.13 新增参数:sql_require_primary_key,开启后建表必须指定主键,否则报错。
MySQL 8.0.30 新功能:GIPK(Generated Invisible Primary Key,不可见主键),开启参数sql_generate_invisible_primary_key后,若表无主键,会自动生成隐藏的my_row_id作为主键,避免手动添加主键的麻烦。
四、总结
核心问题:无主键表在主从复制中,因数据顺序不同导致添加自增主键时主从数据不一致。
最佳实践:建表时必须添加主键,利用 MySQL 的参数强制约束(sql_require_primary_key)或自动生成主键功能(GIPK),从源头避免问题。
posted on
2025-05-16 09:03数据库那些事儿
阅读(59)
评论(0)
收藏举报