› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
Mayuyu
V2EX  ›  MySQL

insert 操作的时 AUTO_INCREMENT 的问题。

  •  
  •   Mayuyu · Apr 21, 2016 · 4813 views
    This topic created in 3812 days ago, the information mentioned may be changed or developed.
    A服务器, A表, AUTO_INCREMENT是从0开始。
    B服务器, A表, AUTO_INCREMENT是从20000000开始。

    因为业务需要,所以可能会需要把 B 服务器的 A 表数据插入到 A 服务器的 A 表。然而问题来了。
    如果A服务器的 A表目前AUTO_INCREMENT是632 , B 服务器的 A 表 AUTO_INCREMENT 是20000514 。
    我往A表insert操作完之后, A表的AUTO_INCREMENT变成了20000515 。


    如果做到insert的时候不影响A服务器A表的自增ID咧?
    15 replies  •  2016-05-04 15:41:36 +08:00
    archer2ee
        1
    archer2ee  
       Apr 21, 2016 via iPhone
    插入后不影响 A 的自增序列的话,整个表就乱套了,后续可能会导致 id 重复的问题。

    这种情况要么在插入到 A 的时候不带 id ,让其随 A 自增,要么就做 DB 同步吧。

    坐等高手。
    Mayuyu
        2
    Mayuyu  
    OP
       Apr 21, 2016
    @archer2ee 所以 B 服务器的 A 表自增 ID 才设为两千万啊。当初这样设计就是为了拿来同步用的,这样重复的可能性就小多了,然而万万没想到插入之后自增 id 也会变的问题。
    shiji
        4
    shiji  
       Apr 21, 2016
    理论上就应该 AUTO_INCREMENT 变成 20000515 呀。

    如果你能确定这个表再怎么增加,都不会过 20000000 产生冲突, 你可以手动把 AUTO_INCREMENT 改回去,反正这种操作是不规范的也是不推荐的。
    hxsf
        5
    hxsf  
       Apr 21, 2016
    @Mayuyu
    > 当初这样设计就是为了拿来同步用的

    为什么不直接用 db 自带的同步功能?
    scusjs
        6
    scusjs  
       Apr 21, 2016
    数据同步过去后,
    alter table table_name AUTO_INCREMENT=n
    msg7086
        7
    msg7086  
       Apr 21, 2016
    @shiji
    @scusjs
    AUTO_INCREMENT 是不能小于数据表里字段最大值的。
    自增的作用本来就是指示表里数据最大值的,根本不是上面说的什么「拿来同步用」的。
    同步用老老实实上唯一 ID 。
    pubby
        8
    pubby  
       Apr 21, 2016
    master-master 的方式,不是应该设这两个参数么?

    A:
    auto-increment-increment = 2
    auto-increment-offset = 0

    B:
    auto-increment-increment = 2
    auto-increment-offset = 1


    auto-increment-increment=机器数 N
    auto-increment-offset = 每台机器序号 [0,1,....,N-1]
    void1900
        9
    void1900  
       Apr 21, 2016
    当初设计就有问题。。。
    BeanMr
        10
    BeanMr  
       Apr 21, 2016 via Android
    如果确认数据库数量为什么不用遗赠步长控制呢? A 库用奇数 B 用偶数!
    kamushin
        11
    kamushin  
       Apr 21, 2016
    AUTO_INCREMENT 不应该用作主键(提升数据库性能)外的任何目的.
    darasion
        12
    darasion  
       Apr 21, 2016
    为什么要这么做? 怕浪费 ID 空间么? 囧。
    Mayuyu
        13
    Mayuyu  
    OP
       Apr 21, 2016
    @darasion 因为公司会在其他很多城市都有业务,所以会在当地架一台服务器。
    魔都的作为主数据库,下面城市的数据会定时的插入到主库,但是为了每个城市的数据写入到上海数据库的时候不重复,所以才想到了用 2kw , 3kw 。。。。。一直到 9kw 。
    不是传统的主从或者主主,需求是:魔都的数据库里面有其他城市的数据,但其他城市的数据库里面只有本地的数据。但偶尔也可能会让本地有上海的数据。
    msg7086
        14
    msg7086  
       Apr 22, 2016
    @Mayuyu 你需要读写分离,多机写入。
    但是不管怎么搞,这样的设计都还是有问题的。
    minotaur
        15
    minotaur  
       May 4, 2016
    为啥不 mod 1024 ,用范围。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   883 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 20:45 · PVG 04:45 · LAX 13:45 · JFK 16:45
    ♥ Do have faith in what you're doing.