php - 如何获取 mysql 中更新行的主键?

标签 php mysql sql pdo transactions

在具有两个表usersapples的数据库中,我想将一个苹果分配给用户,然后知道苹果ID。可以将多个苹果分配给一个用户。我使用 PHP 工作。

// users asks for an apple - lets find a vacant one
$apple_id = $dbh->query("SELECT id FROM apple WHERE user_id IS NULL LIMIT 1")->fetchColumn();

// hope fully we found an apple, lets assign it
$sth = $dbh->prepare("UPDATE apple SET user_id = ? WHERE apple_id = ?");
$sth->execute(array($user_id,apple_id));

问题是另一笔交易可能会选择同一个苹果,然后一个用户会覆盖另一个用户的苹果。 如果我在更新语句中包含AND user_id IS NULL,我就会面临得不到苹果的风险。

我知道我可以选择UPDATE apple SET user_id = ? WHERE user_id IS NULL,但是之后我就不知道apple id了。

有没有办法获取更新行的主键? 像 lastUpdatedId 这样的东西会很好。

但我想我必须使用事务。但我必须选择哪个隔离级别?可重复读取?可序列化?为什么?这意味着什么?它会只锁定行还是整个表?

最佳答案

您可以执行以下操作:

update apple
    set user_id = if(@apple_id := apple_id, ?, ?)
    where user_id is null
    limit 1;

select @apple_id;

关于php - 如何获取 mysql 中更新行的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28395170/

相关文章:

php - HTTPS/PHP/NGINX : php://input data is NULL when HTTPS is enabled

php - 使用 PHP 将 MYSQL 查询中的元素添加到 HTML 表

php - 带有可选日期参数的 REST 路由

java - 我应该执行 SQLQuerys 还是将所有数据转储到列表/vector java 上

PHP 代码不通过批处理文件运行

java url连接设置cookie

java - 选择后插入(Java sql)

sql - MySQL DELIMITER 语法错误

如果有两种语言,MySQL 从表中选择一个值

mysql - 从表中选择值作为新列