• MySQL--修改普通表为自增表


    修改普通表为自增表

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

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

  • 相关阅读:
    怎样做一个优秀的系统分析师
    eBay的架构
    Linux Network Load Balance(Linux下实现负载均衡)
    SNS和互联网,一些可能未必意识到的事
    Web架构设计的几个心得
    开发者不可不知的PHP框架深度解析
    从开发者协议看各SNS开放平台的开放策略
    解剖Twitter:Twitter系统结构分析
    PHP语言的优点及缺点
    大型网站架构不得不考虑的问题
  • 原文地址:https://www.cnblogs.com/gaogao67/p/10392891.html
Copyright © 2020-2023  润新知