簡體   English   中英

如何獲取mysql中更新行的主鍵?

[英]How can I get the primary key of an updated row in mysql?

在具有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 UPDATE apple SET user_id = ? WHERE user_id IS NULL ,但是之后我不知道蘋果的ID。

有沒有辦法獲取更新行的主鍵? lastUpdatedId這樣的東西會很好。

但是我認為我必須使用交易。 但是我必須選擇哪個隔離級別? 可重復閱讀? 可序列化? 又為什么呢? 這意味着什么? 它會只鎖定行還是整個表?

您可以執行以下操作:

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

select @apple_id;

SELECT ... FOR UPDATE將產生完全想要的效果:

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

$dbh->beginTransaction();

// 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 FOR UPDATE")->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));

$dbh->commit();

第二個事務將一直等到第一個事務提交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM