如何在MySQL表中复制行后返回行id?

时间:2012-10-28 15:55:11

标签: mysql pdo last-insert-id

我需要在表格中复制/复制一行,然后返回新行的'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',但不确定原因。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您的查询中存在语法错误,您在CREATE TEMPORARY TABLE语句末尾缺少分号:

CREATE TEMPORARY TABLE tmp_users
    SELECT * FROM users 
    WHERE user_id = $user_id
UPDATE tmp_users 
    SET id = NULL;

即使你认为声明“执行得很好”,你也可以清楚地看到上面的摘录最后只有一个分号;即单个语句,其中包含语法错误,两个单独的CREATEUPDATE语句。

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,显然仍未解决。