Kita tahu bahwa referential integrity merupakan hal yang sangat penting untuk menjaga integritas data, terutama dalam sistem relational database management system (RDBMS) di mana tabel-tabel terhubung satu sama lain dalam hubungan (relasi) tertentu. Akan tetapi ada kalanya kita perlu membuat pengecualian karena desain yang kita buat menuntut hal itu. Oracle mensupport penundaan evaluasi constraint dengan fasilitas DEFERRED.
Saya akan mengambil contoh kasus sederhana dari sini. Kasus ayam dan telur. Kita akan membuat dua tabel yakni chicken dan egg (catatan : struktur tabel hanya merupakan perumpamaan dari kasus deferred constraints dan tidak memperhatikan proses normalisasi maupun aturan desain database yang baik).
CREATE TABLE chicken (cID INT PRIMARY KEY,
eID INT REFERENCES egg(eID));
CREATE TABLE egg(eID INT PRIMARY KEY,
cID INT REFERENCES chicken(cID));
Nah, tabel chicken ternyata memiliki foreign key eID yang merupakan primary key dari tabel egg, begitu juga tabel egg memiliki foreign key cID yang merupakan primary key dari tabel chicken. Dengan struktur yang seperti ini, bagaimana kita bisa menginput data chicken sebelum menginput data egg, atau sebaliknya, menginput data egg sebelum menginput data chicken? Dengan kata lain, data mana yang seharusnya kita input terlebih dahulu, chicken atau egg?
Untuk memecahkan masalah ini, kita perlu melakukan modifikasi struktur.
CREATE TABLE chicken(cID INT PRIMARY KEY,
eID INT);
CREATE TABLE egg(eID INT PRIMARY KEY,
cID INT);
Dalam struktur tabel di atas kita belum memasukkan foreign key. Berikut struktur foreign key nya
ALTER TABLE chicken ADD CONSTRAINT chickenREFegg
FOREIGN KEY (eID) REFERENCES egg(eID)
INITIALLY DEFERRED DEFERRABLE;
ALTER TABLE egg ADD CONSTRAINT eggREFchicken
FOREIGN KEY (cID) REFERENCES chicken(cID)
INITIALLY DEFERRED DEFERRABLE;
Perhatikan bahwa kita menambahkan baris perintah INITIALLY DEFERRED DEFERRABLE. Kita dapat memecahnya menjadi 2.
INITIALLY DEFERRED. Perintah ini mengoverload nilai default INITIALLY IMMEDIATE dari setiap tabel yang dibuat. INITIALLY IMMEDIATE artinya sistem akan mengevaluasi nilai segera setelah nilai tersebut diinsert. Tetapi INTIALLY DEFERRED akan menunda evaluasi nilai dalam rangka referential integrity (implementasi constraint) hingga perintah COMMIT dijalankan.
DEFERRABLE. Perintah ini akan membuat constraint tersebut dapat di-DEFERRED, yang mengoverload nilai default NOT DEFERRABLE dari setiap tabel yang dibuat.
Opsi lain, Anda bisa mengeset constraint menjadi INITIALLY IMMEDIATE DEFERRABLE, dan pada saat dibutuhkan Anda bisa mengeset session Anda menjadi DEFERRED untuk kemudian mengembalikannya kembali jadi IMMEDIATE saat mode DEFERRED sudah tidak diperlukan, dengan contoh seperti berikut (sumber). Misalkan kita memiliki 2 tabel.
CREATE TABLE tab1 (id NUMBER(10), tab2_id NUMBER(10)); CREATE TABLE tab2 (id NUMBER(10));
Kita modifikasi tabel untuk menambahkan constraint.
ALTER TABLE tab2 ADD PRIMARY KEY (id);
ALTER TABLE tab1 ADD CONSTRAINT fk_tab1_tab2 FOREIGN KEY (tab2_id) REFERENCES tab2 (id) DEFERRABLE INITIALLY IMMEDIATE;
Anda dapat mengubah SESSION Anda agar bisa memodifikasi isi tabel dengan mode DEFERRED.
ALTER SESSION SET CONSTRAINTS = DEFERRED;
Kemudian Anda bisa mengembalikan kembali ke mode IMMEDIATE.
ALTER SESSION SET CONSTRAINTS = IMMEDIATE;
Be First to Comment