在 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;

即使您相信语句“执行得很好”,您也可以清楚地看到上述摘录的末尾只有一个 分号;即它是单个语句,其中有语法错误,不是两个单独的 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,显然仍未解决。

【讨论】:

以上是关于在 MySQL 表中复制行后如何返回行 ID?的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP:删除行后如何使自动增量值再次连续

隐藏或删除行后如何更新 HTML 表中的行索引?

MySQL InnoDB 从表中删除数据行后未释放磁盘空间

如何在 MySQL 中使用自动增量字段复制行并插入到同一个表中?

如何从 MySQL 表中获取相同 id 的最新时间戳记录? [复制]

Mysql - 如何按用户对行进行编号? [复制]