Oracle
 sql >> Baza danych >  >> RDS >> Oracle

atomowe porównywanie i zamiana w bazie danych

Czy PK jest kluczem podstawowym? To nie jest problem, jeśli znasz już klucz podstawowy, nie ma sportu. Jeśli pk jest klucz podstawowy, to nasuwa się oczywiste pytanie jak czy znasz pk elementu do usunięcia z kolejki...

Problem polega na tym, że nie znać klucz podstawowy i chcesz usunąć następny „dostępny” (tj. status =y) i oznaczyć go jako usunięty z kolejki (usuń go lub ustaw status =z).

Właściwym sposobem na to jest użycie pojedynczej instrukcji. Niestety składnia różni się między Oracle i SQL Server. Składnia SQL Server to:

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

Nie jestem wystarczająco zaznajomiony z klauzulą ​​RETURNING Oracle, aby podać przykład podobny do tego z SQL OUTPUT.

Inne rozwiązania SQL Server wymagają, aby wskazówki dotyczące blokady na SELECT (z UPDLOCK) były poprawne. W Oracle preferowaną metodą jest użycie FOR UPDATE, ale to nie działa w SQL Server, ponieważ FOR UPDATE ma być używane w połączeniu z kursorami w SQL .

W każdym razie zachowanie, które masz w oryginalnym poście, jest nieprawidłowe. Wiele sesji może wybrać te same wiersze, a nawet wszystkie je zaktualizować, zwracając te same pozycje z kolejki do wielu czytników.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TWÓRZ i UPUŚĆ PRZESTRZEŃ TABEL Oracle

  2. Oracle10 i JDBC:jak sprawić, by CHAR ignorował końcowe spacje przy porównaniu?

  3. Jak uzyskać automatycznie zinkrementowany PK z bazy danych Oracle?

  4. REGEXP_COUNT ignorowanie rozróżniania wielkości liter

  5. Czy słowo kluczowe „as” jest wymagane w Oracle do zdefiniowania aliasu?