1

我已经阅读了 MySQL-bug 列表,在其中发现,当您执行多个插入语句时,last_insert_id() 返回 FIRST 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;
4

2 回答 2

0

您可以使用存储过程来完成所有这些工作吗?像这样的东西?

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 //          
于 2013-09-30T14:15:41.567 回答
-1

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

希望能帮助到你。

于 2013-09-30T13:58:23.163 回答