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

Czy możemy zaktualizować wartości klucza podstawowego tabeli?

Powszechnie przyjmuje się, że klucze podstawowe powinny być niezmienne (lub tak stabilne, jak to możliwe, ponieważ niezmienności nie można wymusić w DB). Chociaż nic nie stoi na przeszkodzie, aby zaktualizować klucz podstawowy (z wyjątkiem ograniczenia integralności), może to nie być dobry pomysł:

Z punktu widzenia wydajności:

  • Będziesz musiał zaktualizować wszystkie klucze obce, które odwołują się do zaktualizowanego klucza. Pojedyncza aktualizacja może prowadzić do aktualizacji potencjalnie wielu tabel/wierszy.
  • Jeśli klucze obce są nieindeksowane (!!), będziesz musiał utrzymać blokadę w tabeli podrzędnej, aby zapewnić integralność. Oracle utrzyma blokadę tylko przez krótki czas, ale i tak jest to przerażające.
  • Jeśli twoje klucze obce są indeksowane (tak jak powinny), aktualizacja doprowadzi do aktualizacji indeksu (usuń+wstaw w strukturę indeksu), jest to zazwyczaj droższe niż rzeczywista aktualizacja tabeli podstawowej.
  • W tabelach INDEKS ORGANIZACJI (w innych RDBMS, patrz klastrowany klucz podstawowy) wiersze są fizycznie sortowane według klucza podstawowego. Aktualizacja logiczna spowoduje fizyczne usunięcie + wstawienie (droższe)

Inne uwagi:

  • Jeśli do tego klucza odwołuje się jakikolwiek system zewnętrzny (pamięć podręczna aplikacji, inna baza danych, eksport...), odniesienie zostanie przerwane podczas aktualizacji.
  • dodatkowo, niektóre RDBMS nie obsługują CASCADE UPDATE, w szczególności Oracle.

Podsumowując, podczas projektowania ogólnie bezpieczniej jest używać klucza zastępczego zamiast naturalnego klucza podstawowego, który powinien się nie zmieniać – ale może ostatecznie wymagać aktualizacji z powodu zmienionych wymagań lub nawet błędu wprowadzania danych.

Jeśli koniecznie musisz zaktualizować klucz podstawowy za pomocą tabeli dzieci, zapoznaj się z tym postem Toma Kyte, aby znaleźć rozwiązanie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sformatować liczbę jako walutę w Oracle

  2. 12c kolumny TOŻSAMOŚĆ

  3. Obliczanie wieku Oracle od daty urodzenia do dnia dzisiejszego

  4. Jak zgłosić wyjątek w wyzwalaczu? Czy jest na to sposób?

  5. Jak napisać aplikację .Net, która działa zarówno z SqlServer, jak i Oracle (teraz System.Data.OracleClient jest przestarzały)