修改普通表为自增表

将普通表修改为自增表,可分为两种类型:

1、将现有列修改为自增列,当数据类型为数值类型且表中数据唯一时,直接只用ALTER TABLE ALTER COLUMN命令进行修改,修改操作会保留现有列中数据。

2、对普通表新增自增列,如果直接使用ALTER TABLE ADD COLUMN来修改,会为每行记录生成新的自增值,但该操作可能会导致主从数据不一致,不建议使用。

新增自增列引发主从数据不一致

在MySQL中允许使用ALTER TABLE方式为普通表新增一个自增列,但由于ALTER操作为DDL语句,在主从复制时会将该DDL语句传递给从库执行,MySQL并不能保证相同记录在主从服务器上获得相同的自增ID,会导致主从数据差异。
模拟测试:

## 主库上创建表:
CREATE TABLE TB1001
(
C1 INT
); ## 会话1开启事务并执行:
START TRANSACTION;
INSERT INTO TB1001(C1) SELECT 1; ## 会话2执行:
INSERT INTO TB1001(C1) SELECT 2; ## 会话1提交事务。 ## 然后将表修改为自增表:
ALTER TABLE TB1001 ADD ID INT PRIMARY KEY AUTO_INCREMENT;

主库数据为:


从库数据为:
 

原因分析:
在主库上,C1=2的数据晚于C1=1的数据被插入,但由于C1=2的数据所在事务被先提交,因此C1=2的记录先于C1=1的记录在从库上执行,因此两条记录在主库和从库上的插入顺序不同,在生成自增ID时获得到自增ID不同,最终导致数据差异。

建议:在将普通表修改为自增表时,如果表中存在数据,请勿使用ALTER TABLE的方式修改,建议新建自增临时表,然后将数据导入到该表中,再兑换表名。

最新文章

  1. java读写file
  2. (实用篇)微信支付扫码支付php版
  3. flex4+fms3.5+cs4开发实时音视频直播及点播详解
  4. SSDB 数据库如何换用 rocksdb 引擎?
  5. 20151224001 GridView 多按钮的各种使用方法
  6. 从linux系统mysql导出数据库
  7. js中的call与apply
  8. C# 使用Linq递归查询数据库遇到的问题及解决方法
  9. oracle 的rowid和rownum
  10. javascript获取选中的文本/html
  11. Android ListView特别属性用法
  12. Storm概念介绍
  13. WCF异常传播
  14. 《JS权威指南学习总结--6.2属性的查询和设置》
  15. VBS调用windows api函数(postmessage)实现后台发送按键脚本
  16. [Unity]SQLite-C#调用
  17. JavaScript 特效三大系列总结
  18. GitLab配置ssh key
  19. linux基础命令学习总结
  20. 2.CLI标准

热门文章

  1. codeforces 568a//Primes or Palindromes?// Codeforces Round #315 (Div. 1)
  2. unittest参数化
  3. Leetcode 115
  4. dp练习(5)——最长严格上升子序列
  5. Ajax中Delete请求参数 后台无法获取的解决方法(Restful风格)
  6. eclipse properties 文件查看和编辑插件 Properties Editor
  7. POJ 3481 SBT做法
  8. redis中的"HashMap"
  9. dubbo的超时重试
  10. HDU 1710 二叉树遍历