MySQL--修改普通表为自增表
2024-10-16 07:39:39
修改普通表为自增表
将普通表修改为自增表,可分为两种类型:
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的方式修改,建议新建自增临时表,然后将数据导入到该表中,再兑换表名。
最新文章
- java读写file
- (实用篇)微信支付扫码支付php版
- flex4+fms3.5+cs4开发实时音视频直播及点播详解
- SSDB 数据库如何换用 rocksdb 引擎?
- 20151224001 GridView 多按钮的各种使用方法
- 从linux系统mysql导出数据库
- js中的call与apply
- C# 使用Linq递归查询数据库遇到的问题及解决方法
- oracle 的rowid和rownum
- javascript获取选中的文本/html
- Android ListView特别属性用法
- Storm概念介绍
- WCF异常传播
- 《JS权威指南学习总结--6.2属性的查询和设置》
- VBS调用windows api函数(postmessage)实现后台发送按键脚本
- [Unity]SQLite-C#调用
- JavaScript 特效三大系列总结
- GitLab配置ssh key
- linux基础命令学习总结
- 2.CLI标准
热门文章
- codeforces 568a//Primes or Palindromes?// Codeforces Round #315 (Div. 1)
- unittest参数化
- Leetcode 115
- dp练习(5)——最长严格上升子序列
- Ajax中Delete请求参数 后台无法获取的解决方法(Restful风格)
- eclipse properties 文件查看和编辑插件 Properties Editor
- POJ 3481 SBT做法
- redis中的";HashMap";
- dubbo的超时重试
- HDU 1710 二叉树遍历