Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Terapkan batasan kunci asing ke kolom tabel yang sama

Oracle menyebutnya sebagai batasan integritas referensial diri. Dokumentasi ada di sini untuk deskripsi,

Anda membuat batasan referensi diri dengan cara yang sama seperti yang biasa Anda lakukan:

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

Saya berasumsi bahwa manager_no Anda dapat dibatalkan. Saya telah menambahkan set null di sini sebagai delete cascade mungkin akan menghapus sejumlah besar meja Anda.

Saya tidak bisa memikirkan cara yang lebih baik untuk melakukan ini. Menghapus seorang manajer seharusnya tidak mengakibatkan penghapusan semua karyawannya sehingga Anda harus set null dan memiliki pemicu di atas meja untuk mengingatkan Anda kepada siapa pun yang tidak memiliki manajer.

Saya selalu menyukai situs ini, yang bagus untuk referensi sederhana. dan jangan lupa untuk memiliki indeks di FK juga atau Tom akan meneriaki Anda :-).

Seseorang juga dapat menggunakan sintaks Oracle standar untuk membuat FK referensi sendiri dalam pernyataan buat tabel, yang akan terlihat seperti berikut ini.

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

EDIT:

Sebagai jawaban atas komentar @popstack di bawah ini:

Meskipun Anda dapat melakukan ini dalam satu pernyataan, tidak dapat mengubah tabel adalah keadaan yang cukup konyol. Anda pasti harus menganalisis tabel yang akan Anda pilih dan Anda masih menginginkan indeks pada kunci asing (dan mungkin lebih banyak kolom dan/atau lebih banyak indeks) jika tidak, setiap kali Anda menggunakan kunci asing yang akan Anda lakukan pemindaian tabel penuh. Lihat tautan saya ke asktom di atas.

Jika Anda tidak dapat mengubah tabel, Anda harus melakukannya, dalam urutan kepentingan yang menurun.

  1. Cari tahu caranya.
  2. Ubah desain DB Anda karena FK harus memiliki indeks dan jika Anda tidak dapat memilikinya maka FK mungkin bukan cara yang tepat. Mungkin memiliki meja manajer dan meja karyawan?


  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:Impor file CSV

  2. Mengambil dump tabel di Oracle 10g menggunakan prosedur PL/SQL

  3. Oracle SQL:Cara menggunakan lebih dari 1000 item di dalam klausa IN

  4. Hapus cache level 2 Hibernate setelah pembaruan DB secara manual

  5. Menghubungkan Perangkat Lunak IRI ke Oracle