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

Wymuszaj ograniczenie klucza obcego do kolumn tej samej tabeli

Oracle nazywa to samoodniesieniem do integralności. Dokumentacja jest tutaj dla opisu,

Tworzysz samoodniesienie w taki sam sposób, jak zwykłe:

alter table employees
  add constraint employees_emp_man_fk
      foreign key ( manager_no )
      references employees ( emp_id )
   on delete set null
      ;

Zakładam, że Twój manager_no jest nullable. Dodałem tutaj set null jako delete cascade prawdopodobnie zniszczyłoby znaczną część twojego stołu.

Nie mogę wymyślić lepszego sposobu na zrobienie tego. Usunięcie menedżera nie powinno skutkować usunięciem wszystkich jego pracowników, więc musisz set null i miej na stole wyzwalacz, aby ostrzec Cię przed każdym, kto nie ma menedżera.

Zawsze lubię tę stronę, co jest dobre dla prostych referencji. i nie zapomnij też mieć indeksu na FK, bo Tom będzie na ciebie krzyczeć :-).

Można również użyć standardowej składni Oracle do utworzenia autoreferencyjnego FK w instrukcji create table, która wyglądałaby następująco.

create table employees
 ( emp_id number
 , other_columns ...
 , manager_no number
 , constraint employees_pk 
    primary key (emp_id)
 , constraint employees_man_emp_fk
    foreign key ( manager_no )
    references employees ( emp_id )
    on delete set null
 );

EDYTUJ:

W odpowiedzi na komentarz @popstack poniżej:

Chociaż możesz to zrobić w jednym stwierdzeniu, brak możliwości zmiany tabeli jest dość absurdalnym stanem rzeczy. Zdecydowanie powinieneś przeanalizować tabelę, z której będziesz wybierać i nadal będziesz potrzebować indeksu klucza obcego (i prawdopodobnie większej liczby kolumn i/lub więcej indeksów) w przeciwnym razie za każdym razem, gdy użyjesz klucza obcego, który zamierzasz zrobić pełny skan tabeli. Zobacz mój link do asktom powyżej.

Jeśli nie możesz zmienić tabeli, powinieneś, w porządku malejącym według ważności.

  1. Dowiedz się, jak możesz.
  2. Zmień projekt bazy danych, ponieważ FK powinien mieć indeks, a jeśli nie możesz go mieć, to prawdopodobnie FK nie są dobrym rozwiązaniem. Może masz stół menedżerów i stół pracownikó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. Oracle SQL, aby zmienić typ kolumny z numeru na varchar2, gdy zawiera dane

  2. Oracle SQL — Zidentyfikuj kolejne zakresy wartości

  3. Najlepszy sposób na okresowe uruchamianie zapytań Oracle

  4. Jak połączyć się z bazą danych Oracle w R?

  5. Jak znaleźć różnice w formacie B/W TIMESTAMP w Oracle?