Membangun relasi antar tabel database MySQL dengan foreign Key


Setelah di tutorial sebelumnya dijelaskan ilustrasi tentang penggunaan foreign key pada tabel film, sekarang saya mencoba menuliskan implementasinya. 
Implementasi foreign key yang akan saya lakukan terlihat seperti topologi tabel di bawah ini:


Maka langkah pertama saya akan membuat tabel-tabel yang menampung data referensi (tabel kategori dan tabel rak) terlebih dahulu baru membuat tabel data utama (tabel film) melalui langkah-langkah di bawah:

Saya masuk ke dalam shell MySQL Server dengan perintah:

 mysql -u root -p

kemudian saya menggunakan database belajar dengan perintah:

 use belajar;

lalu saya buat tabel kategori dengan perintah:

 CREATE TABLE kategori (
 id int PRIMARY Key AUTO_INCREMENT,
 nama varchar(15)
 );

kemudian saya akan buat tabel rak dengan perintah:


 CREATE TABLE rak (
 id int PRIMARY Key AUTO_INCREMENT,
 nama varchar(15)
 );

dan yang terakhir saya akan buat tabel film dengan perintah:

 CREATE TABLE film (
  id int(11) NOT NULL AUTO_INCREMENT,
  nama varchar(50) NOT NULL,
  id_rak int(11) NOT NULL,
  id_kategori int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY id_rak (`id_rak`),
  KEY id_kategori (`id_kategori`),
  CONSTRAINT id_kategori FOREIGN KEY (`id_kategori`) REFERENCES `kategori` (`id`),
  CONSTRAINT id_rak FOREIGN KEY (`id_rak`) REFERENCES `rak` (`id`)
);

setelah itu saya coba memasukkan data ke dalam tabel kategori dengan query seperti berikut:

 INSERT INTO kategori VALUES
 (NULL, 'fiksi'),
 (NULL, 'drama'),
 (NULL, 'horor'),
 (NULL, 'komedi'),
  (NULL, 'action');


maka hasilnya ketika saya menjalankan query SELECT di tabel kategori:

 SELECT * FROM kategori;

hasilnya seperti berikut:


kemudian saya juga memasukkan data ke dalam tabel rak dengan query berikut:

 INSERT INTO rak VALUES
 (NULL, 'abc'),
 (NULL, 'def'),
 (NULL, 'ghi'),
 (NULL, 'jkl');

maka hasilnya ketika saya menjalankan query SELECT di tabel rak:

SELECT * FROM rak;

hasilnya seperti berikut:


setelah itu saya akan memasukkan data ke dalam tabel utama  (tabel film) dengan query berikut:

 INSERT INTO film VALUES (NULL, 'Captain America', 1, 1);

maka hasilnya ketika saya menjalankan query SELECT di tabel film:


 SELECT * FROM film;

hasilnya seperti berikut:


kemudian saya akan mencoba memasukkan data di tabel film seperti berikut:

 INSERT INTO film VALUES (NULL, 'Iron Man', 5, 1);

maka hasilnya error dengan output berikut:


hal ini dikarenakan id_rak yang bernilai 5 yang saya masukkan belum tersimpan di dalam tabel rak. Sehingga jika saya masukkan nilai 5 di dalam tabel rak, error tersebut tidak akan terjadi dan data film "Iron Man" akan tersimpan di dalam tabel film.

Berikut pembuktiannya:

saya memasukkan terlebih dahulu id 5 di tabel rak dengan query berikut:

 INSERT INTO rak VALUES (5, 'mno');

kemudian saya jalankan lagi query:

 INSERT INTO film VALUES (NULL, 'Iron Man', 5, 1);

dan untuk melihat hasilnya saya jalankan kembali query:

 SELECT * FROM film;

maka hasilnya adalah:


data film Iron Man dengan nomer Rak 5 sudah tersimpan di dalam tabel film.

Hal ini juga berlaku ketika memasukkan data di dalam kolom kategori.

Server akan mengecek dahulu apakah data yang akan dimasukkan ke dalam kolom id_kategori di tabel film sudah tersimpan terlebih dahulu di tabel kategori?

Jika benar sudah ada di tabel kategori, barulah kemudian akses penyimpanan data yang akan dimasukkan ke tabel film diperbolehkan.

Sekarang anda sudah tahu bukan, fungsi FOREIGN KEY di MySQL? Foreign Key membatasi data yang akan disimpan pada suatu tabel dengan merujuk suatu data yang telah tersimpan sebelumnya dari tabel lainnya.





Comments