我已经读过我发现的MySQL-bug列表,当你执行多个insert语句时,last_insert_id()返回FIRST auto_increment-value。
(链接:http://bugs.mysql.com/bug.php?id=34319)
我的问题是,在我的代码中,我实际上只在执行了一些select来获取嵌套集的值后才执行1次插入查询。但是last_insert_id()仍然返回“0”作为ID,即使我只有1个插入查询。你知道可能是什么问题吗? :)
$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;
答案 0 :(得分: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 //
答案 1 :(得分:-1)
您可以创建一个#tempTable并将last_insert_ids放在那里,在方法/过程结束时,您可以返回该表。
希望它有所帮助。