FOREIGN KEY Constraint

Jika kita membuat tabel dalam MySQL dengan enggine InnoDb, maka kita bisa menggunakan FOREIGN KEY Constrain. Salah satu manfaanya adalah, misalkan ada tabel induk A dan tabel anak B. Jika kita menghapus record dalam tabel induk A, maka dalam tabel B yang terdapat nilai dalam tabel A akan dihapus.Sintaksnya adalah seperti ini:

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]

Keterangan:

CASCADE: menghapus atau meng-update baris data dalam tabel induk secara otomatis atau mengupdate baris yang sesuai dalam tabel anak

SET NULL: menghapus atau meng-update baris data dalam tabel induk dan men-set kolom/beberapa kolom dalam tabel anak menjadi null. hal ini akan valid jika kolom foreign key tidak memiliki not null. kita boleh menggunakan ON DELETE SET NULL dan ON UPDAE

SET NULL jika kita gunakan SET NULL, pastikan bahwa anda tidak mendeklarasikan kolom dalam tabel anak dalam NOT NULL NO ACTION: dalam standar SQL, NO ACTION berarti tidak diprbolehkan menghapus, merubah nilai primary key jika ada foreign key yang berhubungan dalam tabel referensi. innodb menolak  untuk menghapus atau merubah data pada tabel induk

RESCRICT: tidak memperbolehkan menghapus atau merubah pada tabel induk. ini hampir sama sama dengan NO ACTION SET DEFAULT: aksi ini dibutuhkan oleh parser, tapi InnoDB menolak definisi tabel berupa ON DELETE SET DEFAULT atau ON DELETE SET DEFAULT klausa. OK, biar lebih jelas anda bisa mencoba beberapa percobaan berikut:

# buat database perpustakaan

CREATE DATABASE perpustakaan;

USE perpustakaan;

#buat tabel pengarang

create table pengarang (
id int(5) not null,
nama varchar(30) not null,
alamat varchar(50),
primary key(id)
) engine=innodb;

# buat tabel penerbit

create table penerbit(
id int(5) not null auto_increment,
nama varchar(30) not null,
alamat varchar(50),
primary key(id)
)engine=innodb;

# buat tabel buku

create table buku (
 id int(5) not null,
 id_penerbit int(5),
 id_pengarang int(5),
 isbn varchar(20),
 index (id_penerbit),
 foreign key (id_penerbit) references penerbit(id) on update cascade on delete restrict,
 index (id_pengarang),
 foreign key (id_pengarang) references pengarang(id)
 ) engine=innodb;

# masukkan data ke dalam tabel penerbit

insert into penerbit values(null, 'Intimedia', 'jakarta');
 insert into penerbit values(null, 'Tiara Wacana', 'Yogyakarta');
 insert into penerbit values(null, 'Diva Press', 'Yogyakarta');

# masukkan data ke dalam tabel pengarang

insert into pengarang values(1, 'Abdul kodir', 'Yogyakarta');
 insert into pengarang values(2, 'Salim A Fillah', 'Yogyakarta');
 insert into pengarang values(3, 'Fathan Funtastic', 'Yogyakarta');

Sekarang mari kita lakukan beberapa percobaan

# percobaan 1

insert into buku values(1,6,9,'12345');

Error yang akan muncul kurang lebih seperti ini: ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`learn_mysql`.`buku`, CONSTRAINT `buku_ibfk_1` FOREIGN KEY (`id_penerbit`) REFERENCES `penerbit` (`id`) ON UPDATE CASCADE) Mengapa demikian? Hal ini dikarenakan kita ingin mencoba memasukkan nilai id(id_pengarang, id_penerbit) yang didak ada di dalam tabel pengarang maupun tabel penerbit.

# percobaan 2

insert into buku values(1,2,1,'12345');

Kali ini tidak akan terjadi eror, hal ini karen nilai 2 dan 1 pada perintah di atas sudah terdaftar dalam kedua tabel induk: pengarang, penerbit cobalah untuk melihat isi tabel buku:

select * from buku;
+----+-------------+--------------+-------+
| id | id_penerbit | id_pengarang | isbn  |
+----+-------------+--------------+-------+
|  1 |           2 |            1 | 12345 |
+----+-------------+--------------+-------+

#percobaan 3

delete from penerbit where id=2;

eror yang akan muncul adalah: ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`learn_mysql`.`buku`, CONSTRAINT `buku_ibfk_1` FOREIGN KEY (`id_penerbit`) REFERENCES `penerbit` (`id`) ON UPDATE CASCADE) kenapa? karena kita mendefinisikan pada tabel buku bahwa id dari penerbit adalah ON DELETE RESTRICT,

# percobaan 4

update penerbit set id=7 where id=2;

kali ini tidak akan muncul eror tapi cobalah utuk melihat isi tabel buku berikut:

select * from buku;

+----+-------------+--------------+-------+
| id | id_penerbit | id_pengarang | isbn  |
+----+-------------+--------------+-------+
|  1 |           7 |            1 | 12345 |
+----+-------------+--------------+-------+

jika kita lihat, id_penerbit pada tabel buku juga akan berubah.

5 Komentar »

  1. ryo Said:

    terima kasih tipsnya, tapi saya buth yang dalam sql server..dalam hal ini menginput lewat query analyzer

  2. masaru Said:

    wah lumayan neh buat referensi

  3. Ucok Said:

    mantab coy

  4. Ucok Said:

    Mantab kang

  5. ardi (TK) Said:

    buat tambah ilmu penetahuan,……..asal ga lupa aja,..hehehehe


{ RSS feed for comments on this post} · { TrackBack URI }

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: