› 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
xnotepad
V2EX  ›  MySQL

mysql 中如何在一次性 insert 多条数据的情况下,如何获取当前插入数据的最大自增 ID

  •  
  •   xnotepad ·
    caixw · Jun 9, 2019 · 7536 views
    This topic created in 2670 days ago, the information mentioned may be changed or developed.
    ```sql
    insert into table (col1) values(c1), values(c2)
    ```
    last_isert_id 返回的是最小值,max(id) 又不是线程安全的。
    目前想到的方法是用 last_insert_id 与插入的数量做运算。
    不知道有没有原生 mysql 就支持的函数可以用的?
    18 replies  •  2019-06-10 17:43:02 +08:00
    Takamine
        1
    Takamine  
       Jun 9, 2019 via Android
    emmmmm ……我感觉万恶的存储过程应该可以帮你。(づ ●─● )づ
    chendy
        2
    chendy  
       Jun 9, 2019   ❤️ 3
    取个巧,先批量插入前 n-1 个,最后单独插入最后一个拿 id
    luckylo
        3
    luckylo  
       Jun 9, 2019 via Android
    last_insert_id+插入的条数?
    kj1
        4
    kj1  
       Jun 9, 2019 via Android
    c++ Java go API 都有返回值的,你是问用 SQL 语言查,而不是驱动返回值? SQL 语言无法保证一致性的
    xnotepad
        5
    xnotepad  
    OP
       Jun 9, 2019
    @luckylo 是的,目前就这样实现了,步长可以从 @@auto_increment_step 还是什么的取值。
    xnotepad
        6
    xnotepad  
    OP
       Jun 9, 2019
    @kj1 go 的哪个驱动可以正确返回?我目前用的是 https://github.com/go-sql-driver/mysql,返回的是最小值,我猜应该是采用官方的 last_insert_id() 函数实现的。
    而且我要的也是当前会话的 id,不需要全局的。
    kj1
        7
    kj1  
       Jun 9, 2019 via Android
    golang lastinsertid+rowsaffected 如果插入 0 条,那么 last inserted+rows affected=0
    kj1
        8
    kj1  
       Jun 9, 2019 via Android
    if rowsaffected <= 0
    logwarning
    else
    lastinsertid+rowsaffected-1
    kj1
        9
    kj1  
       Jun 9, 2019 via Android
    如果是 insert on duplicate update 那么各种判断要多很多
    CFO
        10
    CFO  
       Jun 9, 2019 via Android
    必须要自增 id 吗 自己生成 id 放进去行不行?
    gavindexu
        11
    gavindexu  
       Jun 9, 2019 via iPhone
    靠 timestamp 实现?
    agostop
        12
    agostop  
       Jun 10, 2019
    jdbc 不行吗?单条是能返回的,多条没试过
    agostop
        13
    agostop  
       Jun 10, 2019
    喔,没看到是 go,那不清楚,抱歉
    xnotepad
        14
    xnotepad  
    OP
       Jun 10, 2019
    @kj1 这个就和我前面说的一样了。需要自己再操作一步。我是想如果有类似于 postgres 中的 lastval 之类的函数可以直接返回就更好了。
    毕竟自己实现还需要考虑步长等问题,比较麻烦。
    kj1
        15
    kj1  
       Jun 10, 2019 via Android
    @xnotepad 自增功能主要是去重的,dba 装机时一般没有必要将默认步长改为大于 1 吧,自己写几行代码也很快,没有必要希望 MySQL 加个新接口
    superalsrk
        16
    superalsrk  
       Jun 10, 2019
    select table_name, AUTO_INCREMENT from information_schema.tables where table_name="get_max_id";
    xnotepad
        17
    xnotepad  
    OP
       Jun 10, 2019
    @kj1 目前已经实现,发贴只是问一下大家有没有更简单的,或是官方有什么实现方式,我没发现的。
    xnotepad
        18
    xnotepad  
    OP
       Jun 10, 2019
    @superalsrk 你这个实现应该是非线程安全的吧?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2371 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 109ms · UTC 05:22 · PVG 13:22 · LAX 22:22 · JFK 01:22
    ♥ Do have faith in what you're doing.