mysql保留点后面的一位数_详解mysql数据库是如何修改普通表为自增表?

概述

很多时候我们想要对mysql的一张普通表,修改为自增表,可以考虑怎么做呢?

e6240f128fde863e2b9b4e432b712264.png

修改普通表为自增表

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

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;

可以发现主库数据为:

775db9ce05398c128180aadfb9fc6422.png

从库数据为:

62319115ffc0d4f678cfabbc352bc5c9.png

原因分析:

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


总结

如果是主从架构,注意在将普通表修改为自增表时,如果表中存在数据,不要使用ALTER TABLE的方式修改,建议新建自增临时表,然后将数据导入到该表中,再对换表名。

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

c9ebd38ed9b3de5d7717d1333f3aa526.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值