【问题标题】:Retrieve last_insert_id when performing multiple queries执行多个查询时检索 last_insert_id
【发布时间】:2013-10-06 07:55:08
【问题描述】:

我已阅读 MySQL 错误列表,在其中发现,当您执行多个插入语句时,last_insert_id() 返回第一个 auto_increment-value。

(链接:http://bugs.mysql.com/bug.php?id=34319

我的问题是,在我的代码中,我实际上只在执行了一些选择以获取嵌套集的值后才执行 1 次插入查询。但是即使我只有 1 个插入查询,last_insert_id() 仍然返回“0”作为 ID。你知道可能是什么问题吗? :)

$query = $this->prepare("
    SELECT @myRight := c.Rgt FROM ".DB_PREFIX."C_Categories c
    WHERE c.CategoryID = :cat_id;

    UPDATE ".DB_PREFIX."C_Categories c1 SET c1.Rgt = c1.Rgt + 2 WHERE c1.Rgt >= @myRight;
    UPDATE ".DB_PREFIX."C_Categories c2 SET c2.Lft = c2.Lft + 2 WHERE c2.lft > @myRight;

    INSERT INTO ".DB_PREFIX."C_Categories
        (CategoryName, MetaTag, Description, ParentID, Lft, Rgt)
        VALUES (:cat_name, :cat_tag, :desc, :parent_id, @myRight, @myRight+1);
");
$params = array(
    array('cat_name', $data['name'], 'STR'),
    array('cat_tag', $data['metatag'], 'STR'),
    array('desc', $data['description'], 'STR'),
    array('parent_id', $data['parentid'], 'INT'),
    array('cat_id', $parent_id, 'INT')
);

$this->exec($query, $params);

$id = $this->lastInsertId();

return $id;

【问题讨论】:

  • 你能像这样将多个语句放在一个查询中吗?
  • 嗯,它没有给我任何错误 - 它完全按照我的意愿执行 INSERT 查询,所以是的,我很确定,我可以:)
  • @h2ooooooo - 我什至还没有喝过一天中的第一杯咖啡,但我已经学到了一些东西。谢谢你的链接!
  • @denlau 是的 - 这应该是可能的 AFAIC。只要您在此期间不重新连接到数据库(在相同的 PHP 代码中)。也就是说,我不知道在数据库连接中使用 keepalives 是否意味着这些变量是共享的(如果您同时收到两个请求)。我会检查一下以确保。 (一些睡眠魔法和多个请求应该告诉您它是否适用于单个会话,即使您可能使用保持活动/重新连接)。 Here's the MySQL manual page用户定义的变量是特定于会话的

标签: php pdo lastinsertid multi-query


【解决方案1】:

您可以创建一个 #tempTable 并将 last_insert_ids 放在那里,然后在方法/过程结束时返回该表。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    您能使用存储过程来完成所有这些工作吗?像这样?

    DELIMITER //  
    
    CREATE PROCEDURE spUpdateAndInsertCategory (
        IN cat_id INT, 
        IN parent_id INT, 
        IN cat_name VARCHAR(100), 
        IN cat_tag VARCHAR(100), 
        IN cat_desc VARCHAR(100), 
        OUT lastInsertId INT
    )  
    BEGIN  
    
        SELECT @myRight := c.Rgt FROM C_Categories c
        WHERE c.CategoryID = cat_id;
    
        UPDATE C_Categories c1 SET c1.Rgt = c1.Rgt + 2 WHERE c1.Rgt >= @myRight;
        UPDATE C_Categories c2 SET c2.Lft = c2.Lft + 2 WHERE c2.lft > @myRight;
    
        INSERT INTO C_Categories
            (CategoryName, MetaTag, Description, ParentID, Lft, Rgt)
            VALUES (cat_name, cat_tag, cat_desc, parent_id, @myRight, @myRight+1);
    
        SELECT lastInsetId AS SELECT MAX(cat_id) from C_Categories;
    
    END //          
    

    【讨论】:

      猜你喜欢
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 2014-01-09
      • 2012-12-29
      • 2021-08-23
      相关资源
      最近更新 更多