Sebuah foreign-key digunakan untuk maintanance data integrity the problem is gimana klo kita hapus dari tabel yang menjadi acuan kita terus gimana nasibnya? invalid relation?

Nah secara default, kita gak bisa update primary-key value yang udah digunakan karena secara default oracle menerapkan option restrictions contohnya seperti berikut:

SQL> delete
from TEST_FK_MASTER_TABLE
where ID = 'prog';

ERROR at line 1:
ORA-02292: integrity constraint (HR.FK_DETAIL_MASTER_ID) violated - child
record found

Sebagai solusinya ada trigger yang kita bisa gunakan yaitu

on delete, perintah ini dijalankan ketika query delete di execute yang memiliki constraint foreign key dan me-referensi ke table pada kolom tersebut yang harus digabungkan dengan option sebagai berikut:

  1. set null
  2. cascade

Ok sekarang kita siapkan dulu table masternya seperti berikut:

Set Null

Dengan menggunakan set null, begitu data di table master di hapus tetapi masih memiliki relasi maka automatis nilainya akan di set null seperti berikut:

Sekarang coba execute perintah delete berikut:

delete
from test_constraint_fk_options
where id = 'rnd';

Maka hasilnya seperti berikut:

SQL> delete
from test_constraint_fk_options
where id = 'rnd';

1 row deleted.

SQL> select * from test_constraint_fk_options_set_null;

ID         FIRST_NAME      MASTER_ID  SALARY
---------- --------------- ---------- ----------
01         Dimas Maryanto  <null>     9000
02         Muhamad Yusuf   prog       8000

Cascade

Dengan menggunakan cascade, begitu data di table master di hapus tetapi masih memiliki relasi maka automatis akan dihapus juga pada baris yang memiliki constraint tersebut, sebagai contoh berikut adalah querynya:

Sekarang coba execute perintah delete berikut:

delete from test_constraint_fk_options
where id = 'arch';

Maka hasilnya seperti berikut:

SQL> select * from test_constraint_fk_options_cascade;

ID         FIRST_NAME       MASTER_ID    SALARY
---------- ---------------------------  ----------
01         Dimas Maryanto   arch        9000
02         Muhamad Yusuf    prog        8000


SQL> delete from test_constraint_fk_options
where id = 'arch';

1 row deleted.

SQL> select * from test_constraint_fk_options_cascade;

ID         FIRST_NAME       MASTER_ID    SALARY
---------- ---------------- ----------   ----------
02         Muhamad Yusuf    prog         8000