修改普通表为自增表

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

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的方式修改,建议新建自增临时表,然后将数据导入到该表中,再兑换表名。

MySQL--修改普通表为自增表的更多相关文章

  1. mysql修改编码(数据库,表,字段)

    查看各个编码 //查看字段编码 SHOW FULL COLUMNS from park_car_user; //查看数据库字段SHOW CREATE DATABASE db_name; //查看表的编 ...

  2. mysql修改表、字段、库的字符集

    在一次导入数据表(MYISAM)的经历:复制过来的表打开后中文出现乱码,肯定是字符集出现了不致的问题,所以从原数据库导出.sql文件,修改其中的创建表的语句,加入字符集DEFAULT CHARSET= ...

  3. Java Maven:spring boot + Mybatis连接MySQL,通用mapper的增删改查,映射实现多表查询

    1. MySQL自带库test添加表user.role 角色表role 用户表user 2. 添加依赖,配置属性 相关依赖:百度即可,此处略 application.properties spring ...

  4. MySQL修改表一次添加多个列(字段)和索引

    MySQL修改表一次添加多个列(字段) ALTER TABLE table_name ADD func varchar(50), ADD gene varchar(50), ADD genedetai ...

  5. mysql修改数据库表权限

    ps:通常我用的是:1.“grant all on *.* to root@'%' identified by 'yourpassword';”——这个还可以顺带设置密码.2.“flush privi ...

  6. mysql修改表和列

    mysql修改列 mysql增加列,修改列名.列属性,删除列语句   mysql修改表名,列名,列类型,添加表列,删除表列     alter table test rename test1; --修 ...

  7. MySQL修改数据表存储引擎的3种方法介绍

    这篇文章主要介绍了MySQL修改数据表存储引擎的3种方法介绍,分别是直接修改.导出导入.创建插入3种方法, 可以参考下   MySQL作为最常用的数据库,经常遇到各种各样的问题.今天要说的就是表存储引 ...

  8. mysql修改表的存储引擎(myisam<=>innodb)【转】

    修改表的存储引擎myisam<=>innodb 查看表的存储引擎mysql> show create table tt7;+-------+--------------------- ...

  9. mysql修改表名

    mysql修改表名 SQL语句为: alter table table_name rename to new_table_name 参考:http://blog.csdn.net/xrt95050/a ...

随机推荐

  1. C# Arc Gis实例教程——网络链接

    http://www.doc88.com/p-305888679879.html http://www.doc88.com/p-992232217007.html http://www.cnblogs ...

  2. JS-Object(2) 原型对象 ,prototype属性。

    基础✅ prototype(✅) JS中的继承 使用JSON数据 构建对象实战 基础 关键字"this"指向了当前代码运行时的对象( 原文:the current object t ...

  3. Ultimate Weirdness of an Array CodeForces - 671C (gcd,线段树)

    大意: 定义一个数列的特征值为两个数gcd的最大值, $f(l,r)$表示数列删除区间$[l,r]$的元素后剩余元素的特征值, 求$\sum_{i=1}^n\sum_{j=i}^n{f(i,j)}$ ...

  4. OAF Sample Code(转)

    原文地址: OAF Sample Code

  5. quartz---properties

    quartz---properties quartz.properties: 如果没有properties默认读取quartz-2.3.0.jar下的org.quartz下的quartz.proper ...

  6. duilib CEditUI 禁止输入中文字符,禁止复制粘贴

    1.CEditUI 禁止使用中文输入法 在 CEditUI::DoEvent 函数中,添加代码: if(m_bOnlyEnglishChar && m_pWindow &&am ...

  7. python自动化运维之路04

    装饰器 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象 ...

  8. java基本类型的大小

    1个字节是8位byte 1字节short 2字节int 4字节long 8字节float 4字节double 8字节char 2字节boolean 1字节======================= ...

  9. 基于struts2和hibernate的登录和注册功能——完整实例

    1.该项目使用MySQL数据库,数据库名为test,表名info,如图所示: 2.配置web.xml(Struts2使用) <?xml version="1.0" encod ...

  10. 【笔记】《深入浅出MFC》第6章 MFC程序的生死因果

    一.头文件说明 STDAFX.H 这个文件用来作为Precompile header file,其内只是载入其他的MFC头文件.应用程序通常会准备自己的头STDAFX.H. AFXWIN.H 每一个W ...