Portál AbcLinuxu, 6. listopadu 2025 14:42
tabulka 'reg' má sloupce id, temp a email
$stmt = $pdo->prepare('UPDATE `reg` SET temp = ? WHERE email = ?');
$stmt->execute(array($temp, $email));
a potřeboval bych nějak po provedení tohoto dotazu vrátit id toho řádku ve kterém se ten update provedl. Děkuji
id pomocou SELECT `id` FROM `reg` WHERE email = ?. A potom zmeniť temp pomocou UPDATE `reg` SET temp = ? WHERE id = ?.
SELECT FOR UPDATE. Jinak se může záznam mezi SELECTem a UPDATEm nekontrolovaně změnit a UPDATE pak aktualizuje špatný záznam.
V tom případě je ale potřeba použít SELECT FOR UPDATE.
Jak to myslíte? nic nemůžu kolm toho najít.. díky
SELECT FOR UPDATE zamkne příslušné řádky, takže je jiná transakce nemůže měnit. Když řádky nezamknete, může při souběhu transakcí dojít ke změně jiných dat, než jste čekal.
Transakce 1 | Transakce 2
SELECT id FROM table WHERE email = 'franta@novak.cz'; |
-- id = 1 |
|
| UPDATE table SET email = 'hugo@boss.cz' WHERE id = 1;
|
UPDATE table SET temp = 123 WHERE id = 1; |
V transakci 1 jste tedy změnil záznam s e-mailem hugo@boss.cz, přitom jste chtěl změnit záznam s e-mailem franta@novak.cz.
UPDATE `reg` SET temp = ? WHERE email = ?
V mysql můžeš
UPDATE `reg` SET id = @id := id, temp = ? WHERE email = ? a pak id zjistit SELECT @id.
Portabilní verzi je přes zamykání (tzn. select id where .... for update a pak teprv updatnout dle id), jak píší předřečníci.
Pokud používáš postgresql, můžeš udělat:
UPDATE `reg` SET temp = ? WHERE email = ?
Předpokládám, že bylo myšleno
UPDATE `reg` SET temp = ? WHERE email = ? RETURNING id;
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.