[英]How can I get the primary key of an updated row in mysql?
在具有users
和apples
這兩個表的數據庫中,我想為用戶分配一個蘋果,然后知道蘋果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.