php - 如何从 LAST_INSERT_ID (`my_column` +1) 获取表达式的值?

标签 php mysql pdo mariadb

数据库类型: MariaDB
表引擎:InnoDB

我有一个表,其中有一列的值正在递增(不是自动的,该表中没有插入)

当我在 phpMyAdmin 中运行以下 SQL 查询时,它工作正常:

UPDATE `my_table` 
    SET `my_column` = LAST_INSERT_ID(`my_column` + 1) 
WHERE `my_column2` = 'abc'; 
SELECT LAST_INSERT_ID();

当查询发生时,上面的代码返回了 my_column 表的最后一个值。此查询直接取自有关锁定的 mysql 文档:https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html (到底部)当您不希望它受到其他连接的影响时,这似乎是使用计数器的推荐方式。

我的 PDO:

try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            
    $sql = "UPDATE `my_table` 
                SET `my_column` = LAST_INSERT_ID(`my_column` + 1) 
                WHERE `my_column2` = 'abc'; 
            SELECT LAST_INSERT_ID();";

    // Prepare statement
    $stmt = $conn->prepare($sql);

    // execute the query
    $stmt->execute();

    $result = $stmt->fetchColumn(); // causes general error
    $result = $stmt->fetch(PDO::FETCH_ASSOC);// causes general error

    // echo a message to say the UPDATE succeeded
    echo $stmt->rowCount() . " records UPDATED successfully";
        
} catch(PDOException $e) {            
    echo $sql . "<br>" . $e->getMessage();        
}
$conn = null;

确切错误 SQLSTATE[HY000]:一般错误,如果我删除我尝试获取结果的行,它会更新该列,但我仍然没有返回结果...我如何像在 phpMyAdmin 中运行它时那样执行该更新查询并一次性获得选择结果?这一切都需要按照 MySQL 文档的规定一次性完成,因此我不会遇到两个连接可能获得相同计数器的问题。

最佳答案

无需执行 SELECT LAST_INSERT_ID();。 PDO 会自动为您保存该值,您可以从 PDO 中获取它。

只需这样做:

$conn = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8mb4", $username, $password, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
        
$sql = "UPDATE `my_table` 
            SET `my_column` = LAST_INSERT_ID(`my_column` + 1) 
            WHERE `my_column2` = 'abc'";

// Prepare statement
$stmt = $conn->prepare($sql);

// execute the query
$stmt->execute();

$newID = $conn->lastInsertId();

lastInsertId() 将为您提供由 LAST_INSERT_ID() 评估的参数值.

关于php - 如何从 LAST_INSERT_ID (`my_column` +1) 获取表达式的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62850189/

相关文章:

php - PHP PDO 语句可以接受表名或列名作为参数吗?

mysql - 可以将 RDBMS 的 COMMIT 事务/"all-or-nothing"范例映射到 R 吗?

php - 如何在mysql中选择整个星期的星期一到星期日?

PHP PDO 基本准备语句

PHP 选择多个表作为数组

php - SQL 查询按时间戳分组和排序

javascript - 数据表激活单单元格编辑 onclick(第 2 部分)

mysql - 如何最后订购没有库存的商品

mysql - 如何使用sql从多个表中获取列

MySQL 查询大数据时速度非常慢