Oracle
 sql >> база данни >  >> RDS >> Oracle

Наложете ограничение за външен ключ към колони от същата таблица

Oracle нарича това ограничение за самореферентна цялост. Документацията е тук за описание,

Вие създавате самореферентно ограничение по същия начин, по който бихте направили нормално:

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

Предполагам, че вашият manager_no е нула. Добавих set null тук като delete cascade вероятно ще изтрие значително количество от вашата маса.

Не мога да измисля по-добър начин да направя това. Изтриването на мениджър не трябва да води до изтриване на всички техни служители, така че трябва да set null и има тригер на масата, за да ви предупреди за всеки, който няма мениджър.

Винаги харесвам този сайт, който е добър за прости препратки. и не забравяйте да имате индекс на FK, или Том ще ви крещи :-).

Човек може също да използва стандартен синтаксис на Oracle, за да създаде самореферентен FK в израза за създаване на таблица, който би изглеждал така.

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
 );

РЕДАКТИРАНЕ:

В отговор на коментара на @popstack по-долу:

Въпреки че можете да направите това с едно изявление да не можете да промените таблица е доста нелепо положение на нещата. Определено трябва да анализирате таблица, от която ще избирате, и все пак ще искате индекс на външния ключ (и евентуално повече колони и/или повече индекси) в противен случай всеки път, когато използвате външния ключ, който ще направите пълно сканиране на таблицата. Вижте моята връзка към asktom по-горе.

Ако не можете да промените таблица, тогава трябва, в низходящ ред по важност.

  1. Разберете как можете.
  2. Променете дизайна на DB, тъй като FK трябва да има индекс и ако не можете да имате такъв, тогава FK вероятно не са подходящият начин. Може би има маса с мениджъри и маса със служители?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Примерни схеми на GitHub

  2. Функция COMPOSE() в Oracle

  3. Как да разрешите ORA-29283:невалидна файлова операция

  4. Как да получа текстово съдържание от BLOB в Oracle SQL

  5. Управление на CDB флот в Oracle Database 18c