sql >> Database teknologi >  >> RDS >> Oracle

atomsammenligning og swap i en database

Er PK den primære nøgle? Så er dette et ikke-problem, hvis du allerede kender den primære nøgle, er der ingen sport. Hvis pk er den primære nøgle, så rejser dette det åbenlyse spørgsmål hvordan kender du pk'en for den vare, der skal sættes i kø...

Problemet er, hvis du ikke kender den primære nøgle og ønsker at sætte den næste 'tilgængelige' i kø (dvs. status =y) og markere den som sat i kø (slet den eller indstil status =z).

Den rigtige måde at gøre dette på er at bruge en enkelt sætning. Syntaksen er desværre forskellig mellem Oracle og SQL Server. SQL Server-syntaksen er:

update top (1) [<table>]
set status = z 
output DELETED.*
where  status = y;

Jeg er ikke bekendt nok med Oracles RETURNING-klausul til at give et eksempel, der ligner SQLs OUTPUT.

Andre SQL Server-løsninger kræver låsetips på SELECT (med UPDLOCK) for at være korrekte. I Oracle er den foretrukne vej at bruge FOR UPDATE, men det virker ikke i SQL Server, da FOR UPDATE skal bruges sammen med markører i SQL .

Under alle omstændigheder er den adfærd du har i det originale indlæg forkert. Flere sessioner kan alle vælge den eller de samme række(r) og endda alle opdatere den, hvilket returnerer den eller de samme varer i kø til flere læsere.



  1. Generisk trigger for at begrænse indsættelser baseret på antal

  2. SET og Select Query kombinerer Kør i en enkelt MySql-forespørgsel for at bestå resultatet i pentaho

  3. SQL Server Data Platform Opgradering i 2015

  4. BESTIL EFTER ét ID, når der er flere af de samme ID'er i en tabel