Portál AbcLinuxu, 14. května 2025 04:31
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 SELECT
em a UPDATE
m 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.