【问题标题】:Get array of Last Inserted Ids mysql php获取最后插入的ID数组mysql php
【发布时间】:2014-05-03 11:45:56
【问题描述】:

我有一个类似的查询 Insert into tbl(str)values('a'),('b'),('c')

如果我有一个插入,那么通过使用 mysqli_insert_id($con) 我可以插入最后一个 id,但是如何在这个多插入查询中插入所有 id?

【问题讨论】:

    标签: php mysql arrays


    【解决方案1】:

    last_insert_id() 的这种行为是documented in the MySQL docs:

    当前执行的语句不影响 LAST_INSERT_ID()。假设您生成一个 AUTO_INCREMENT 值 用一个语句,然后在一个语句中引用 LAST_INSERT_ID() 多行 INSERT 语句,将行插入到表中 自己的 AUTO_INCREMENT 列。 LAST_INSERT_ID() 的值将保持不变 在第二个语句中稳定;第二次及以后的价值 rows 不受早期行插入的影响。 (但是,如果你 混合引用LAST_INSERT_ID()LAST_INSERT_ID(expr),即 效果未定义。)

    如果你真的需要它,你可以使用 foreach 和 array_push 来测试它

     <?php
    
    $InsetQueryArray = array(
        "Insert into tbl(str) values('a')",
        "Insert into tbl(str) values ('b')",
        "Insert into tbl(str) values('c')"
    );
    
    $allLasIncrementIds = array();
    
    foreach ($InsetQueryArray as $value) {
    
        //execute it mysql 
        //Then use array_push 
    
        array_push($allLastIncrementIds, mysqli_insert_id($con));
    
    }
    
    ?>
    

    【讨论】:

    • 但这会影响性能吗?让服务器太慢?
    • 你的查询和foreach(){ mysqli_query(insert into ...) //3 times a,b and c }之间有什么区别
    • 从 php 发送数千个单独的查询而不是 3 个长插入...值 (),(),... 肯定慢得多。
    【解决方案2】:

    如果只是几行,您可以切换到使用 last_insert_id() 发送单个插入。否则,它会显着减慢您的应用程序。你可以为这些批量插入做一个标记,它被设置为一个数字,在批量插入本身上标识这个批量插入,你可以稍后获取这些 id:

    insert into tbl (stuff, tmp_marker) values ("hi",1715),("ho",1715),("hu",1715);
    
    select group_concat(id) from tbl where tmp_marker = 1715;
    
    update tbl set tmp_marker=0 where tmp_marker=1715;
    

    如果这些批量插入有意义,您还可以使用用户、时间和文件名或其他任何内容创建一个表 import_tbl,并保留 1715 作为对该导入的引用。

    编辑:经过讨论,我会去一个导入表

    CREATE TABLE import (id int(11) not null auto_increment primary key, user_id int(11), tmstmp timestamp);
    

    当导入开始时,插入:

    INSERT INTO import set user_id = $userId;
    

    在 php 中:

    $importId = last_insert_id();
    
    $stmt = "insert into tbl (str, import_id) values ('a',$import_id), ('b', $import_id),('c',$importId);
    

    然后你可以用你最近导入的行的 id 做任何你想做的事情。

    我还没有研究是否保证多行插入会导致连续的 ID 行,因为假设 last_insert_id() 和 num_rows 的组合。如果情况一直如此,即使 MySQL 增加了并行化。所以我认为依赖它是危险的。

    【讨论】:

    • 我使用了 last_insert_id() 和 row_count() 并且它有效。这些方法可以吗?
    • 我认为依赖打包的 ID 块有点脏,但只要它可以工作就可以了。如果您认为“导入”(或您从中获取数据的任何地方)是一个实体,请使用导入表。我不确定当插入语句被您的方法破坏或停止时会发生什么。
    • 如果用户插入行并且我使用我的方法计算 id 并且突然另一个用户同时插入,那么两个用户插入的那些 id 会混合吗?还是一个接一个地插入?
    • 是的,好问题。我希望它是下一个查询之后的一个查询,但是您应该使用脚本进行尝试。我不知道您是在查询中插入 20 行还是 2000 行。我更喜欢我的方式,因为这只是一点点努力,我可以将插入用户、时间等存储在“导入”表中。但这并不意味着稍微简单的替代方案是错误的。这个 id-list 有多重要?如果系统混淆了会出现什么问题?
    • 非常重要!系统受到干扰!有没有可能搞混?
    猜你喜欢
    • 2011-06-01
    • 2011-09-23
    • 1970-01-01
    • 2010-10-28
    • 2017-10-14
    • 2010-12-13
    • 1970-01-01
    • 2016-11-25
    相关资源
    最近更新 更多