Как получить значение выражения из LAST_INSERT_ID (`my_column` + 1)? - PullRequest
2 голосов
/ 11 июля 2020

Тип БД: MariaDB
Механизм таблиц: InnoDB

У меня есть таблица, внутри которой есть столбец со значением, которое увеличивается ( не автоматически, в этой таблице не происходит вставка)

Когда я запускаю следующий SQL запрос в phpMyAdmin, он работает нормально, как и должен:

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]: General error, если я удалю строки, в которых я пытаюсь получить результат, он обновит столбец, но я все равно это сделаю нет результата возврата ... как мне выполнить этот запрос на обновление и получить результат выбора в одном go, как я это делаю, когда запускаю его в phpMyAdmin? Все это должно происходить в одном go, как указано в MySQL документах, поэтому у меня нет проблем, когда два соединения могут иметь один и тот же счетчик.

1 Ответ

6 голосов
/ 11 июля 2020

Нет необходимости выполнять 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().

...