在 MySQL 表中复制行后如何返回行 ID?
Posted
技术标签:
【中文标题】在 MySQL 表中复制行后如何返回行 ID?【英文标题】:How to return row id after copying row in MySQL table? 【发布时间】:2012-10-28 15:55:10 【问题描述】:我需要复制/复制表中的一行,然后返回新行的“id”值。我的 'id' 列是一个自动增量字段。
$sth = $dbh->prepare("DROP TEMPORARY TABLE IF EXISTS tmp_users;
CREATE TEMPORARY TABLE tmp_users
SELECT * FROM users
WHERE user_id = $user_id
UPDATE tmp_users
SET id = NULL;
INSERT INTO users
SELECT * FROM tmp_users;
DROP TEMPORARY TABLE IF EXISTS tmp_users;");
$sth->execute();
如果我这样做 $id_new = $dbh->lastInsertId();
这将返回“0”,但不知道为什么。有什么想法吗?
【问题讨论】:
PDO::prepare
似乎不支持一个字符串中的多个语句;即使是这样,您在 CREATE TEMPORARY TABLE
语句之后缺少一个分号,因此它仍然无效。
上面的语句似乎使用 prepare 执行得很好。但是,我似乎无法返回新插入行的 id。
【参考方案1】:
您的查询中有语法错误,您的CREATE TEMPORARY TABLE
语句末尾缺少分号:
CREATE TEMPORARY TABLE tmp_users
SELECT * FROM users
WHERE user_id = $user_id
UPDATE tmp_users
SET id = NULL;
即使您相信语句“执行得很好”,您也可以清楚地看到上述摘录的末尾只有一个 分号;即它是单个语句,其中有语法错误,不是两个单独的 CREATE
和 UPDATE
语句。
PDO 似乎对多语句查询的处理非常糟糕,未能报告其中的错误。我进行了以下测试:
$sth = $dbh->prepare("INSERT INTO test VALUES ('test1');
INVALID STATEMENT;
INSERT INTO test VALUES ('test2');");
$sth->execute();
如您所见,我在两个有效的INSERT
语句之间包含了一个无效语句。运行上面的代码后,我的测试表只插入了'test1'
的值,但是'test2'
没有插入,PDO也没有报错。
CREATE TEMPORARY TABLE
中的语法错误阻止了表的实际创建,这也阻止了其余语句正常运行,因此您没有新行插入到users
表中,也没有最后插入的 ID。
更新:这是此 PDO 行为的实际 php bug report,显然仍未解决。
【讨论】:
以上是关于在 MySQL 表中复制行后如何返回行 ID?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MySQL 中使用自动增量字段复制行并插入到同一个表中?