Free Ebook Tutorial from Rosihan Ari's Blog

Tutorial Javascript | Tutorial PHP | Tutorial AJAX | Tutorial CSS | Tutorial FPDF | Tutorial Wordpress | Tutorial Java SE


Ebook yang direkomendasikan untuk Anda
Kunjungi Toko Ebook RosihanAri.Net


Foreign Key, Relationship dan Referential Integrity di MySQL


October 27th, 2008 | by rosihanari | Cetak Artikel Cetak Artikel


GampSMS SMS Gateway

Ada beberapa mahasiswa saya yang bertanya, “Pak… bisa tidak di MySQL diterapkan konsep Foreign Key dan Referential Integrity seperti halnya di MS. Access?”. Memang dalam MS. Access kita bisa melakukan setting relasi antar tabel, yang menggambarkan hubungan PRIMARY KEY dan FOREIGN KEY antar tabel.

Sebagai contoh, misalkan dalam kasus pengambilan matakuliah mahasiswa. Dalam kasus ini misalkan terdapat tabel induk bernama ‘MHS’ yang di dalamnya terdapat field NIM, NAMAMHS. Tabel induk yang lain adalah ‘MK’ untuk menyimpan data matakuliah dengan field-fieldnya KODEMK, NAMAMK. Dalam hal ini field NIM dan KODEMK masing-masing adalah primary key pada tabel ‘MHS’ dan ‘MK’. Selanjutnya ada tabel lain bernama ‘AMBILMK’ dengan field NIM, KODEMK, NILAI yang digunakan untuk menyimpan data pengambilan matakuliah mahasiswa. Nah… dalam hal ini, field NIM dan KODEMK keduanya adalah bertindak sebagai FOREIGN KEY.

Selanjutnya dalam MS. Access terdapat pula fasilitas untuk mengimplementasikan referensial integrity. Misalkan, kita ubah data salah satu kode NIM mahasiswa dalam tabel induk ‘MHS’. Nah… secara otomatis proses update ini juga terjadi di tabel ‘AMBILMK’ yaitu pada data yang terkait NIM tersebut. Begitu pula pada proses penghapusan. Sebagai contoh misalkan kita hapus salah satu kode matakuliah di tabel MK, maka secara otomatis data yang terkait dengan kode matakuliah tersebut pada tabel ‘AMBILMK’ akan terhapus.

Nah.. bagaimana dengan MySQL? Kira-kira bisa tidak diterapkan kedua hal di atas seperti halnya MS. Access? Saya jawab TENTU SAJA BISA.

Yang menjadi pertanyaan adalah, “Bagaimana cara melakukannya?”.

Ya… untuk menerapkan konsep FOREIGN KEY dan REFERENTIAL INTEGRITY ini, kita harus mensetting MySQL nya bisa support untuk tabel bertipe INNODB. Biasanya ketika proses instalasi MySQL akan ditanyakan apakah databasenya support dengan INNODB? Untuk hal ini, Anda harus jawab YA. Namun.. bila proses instalasi Anda terlanjur tidak memilih support INNODB, maka cara mengaktifkan INNODB adalah buka file “my.ini” lalu cari baris perintah “skip-innodb”. Hapuslah perintah ini, lalu hentikan MySQL dan hidupkan kembali MySQL (restart MySQL).

OK… sekarang kita coba untuk studi kasus. Kita akan membuat database untuk keperluan pengambilan matakuliah mahasiswa seperti pada kasus di atas. Berikut ini, adalah perintah SQL untuk membuat tabel-tabelnya.

Perintah SQL untuk membuat tabel ‘MHS’

CREATE TABLE mhs
(
  nim  varchar(8),
  namaMhs varchar(20),
  PRIMARY KEY (nim)
) TYPE = INNODB;

Perintah SQL untuk membuat tabel ‘MK’

CREATE TABLE mk
(
  kodeMK  varchar(3),
  namaMK varchar(20),
  PRIMARY KEY (kodeMK)
) TYPE = INNODB;

Perhatikan kedua perintah SQL di atas. Karena kita akan membuat tabel bertipe INNODB, maka masing-masing perintah SQL diberikan perintah TYPE = INNODB;

Sekarang, kita lanjutkan untuk membuat tabel untuk ‘ambilMK’.

CREATE TABLE ambilMK
(
  nim  varchar(8),
  kodeMK varchar(3),
  nilai float(3,2),
  PRIMARY KEY (nim, kodeMK),
  FOREIGN KEY (nim) REFERENCES mhs (nim) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (kodeMK) REFERENCES mk (kodeMK) ON DELETE CASCADE ON UPDATE CASCADE
) TYPE = INNODB;

Tabel di atas terdapat dua primary key yaitu NIM dan KODEMK. Sedangkan field NIM ini juga merupakan foreign key yang direferensikan dari field NIM yang ada dalam tabel MHS. Oleh karena itu tambahkan perintah “FOREIGN KEY (nim) REFERENCES mhs (nim)”. Selanjutnya apa maksud dari “ON DELETE CASCADE”? Perintah ini maksudnya bila ada data NIM yang dihapus pada tabel MHS, maka secara otomatis data NIM yang ada dalam tabel AMBILMK ini juga akan terhapus. Sedangkan “ON UPDATE CASCADE” digunakan untuk proses update otomatis pada NIM dalam tabel AMBILMK, apabila NIM yang ada di tabel MHS ini diupdate.

Hal yang sama juga kita terapkan untuk tabel AMBILMK. Dalam hal ini, KODEMK adalah sebagai foreign key yang direfensikan dari KODEMK yang ada dalam tabel MK.

Sekarang coba Anda masukkan data-data berikut ini pada tabel MHS

NIM       NAMAMHS
M0197001  Rosihan Ari Yuana
M0197002  Dwi Amalia Fitriani
M0197003  Faza Fauzan
M0197004  Nada Hasanah
M0197005  Muh. Ahsani Taqwim

Masukkan pula data pada tabel MK

KODEMK    NAMAMK
M01       Database
M02       OOP

Nah… untuk mengecek referensial integrity, sekarang kita coba masukkan data pada tabel AMBILMK.

INSERT INTO ambilmk VALUES ('M0197001', 'M01', 3.0);

Ketika perintah SQL di atas dijalankan, data dapat dimasukkan ke tabel AMBILMK dengan sukses. Kita lihat bahwa NIM M0197001 terdapat dalam tabel MHS, begitu pula pada kode matakuliah M01 yang ada pada tabel MK.

Sehingga isi tabel AMBILMK menjadi

NIM       KODEMK    NILAI
M0197001  M01       3.0

Sekarang kita coba masukkan data berikut ini

INSERT INTO ambilmk VALUES ('M0197006', 'M01', 3.0);

Nah… perintah di atas akan menghasilkan error. Hal ini disebabkan NIM M0197006 tidak ada dalam tabel MHS.

Sekarang kita coba melakukan proses update. Kita akan mengupdate NIM M0197001 menjadi M0197010 yang ada dalam tabel MHS.

UPDATE mhs SET nim = 'M0197010' WHERE nim = 'M0197001';

Hasil query di atas pada tabel MHS menjadi

NIM       NAMAMHS
M0197010  Rosihan Ari Yuana
M0197002  Dwi Amalia Fitriani
M0197003  Faza Fauzan
M0197004  Nada Hasanah
M0197005  Muh. Ahsani Taqwim

Sekarang Anda coba lihat isi tabel AMBILMK. Pastilah isinya menjadi berikut ini

NIM       KODEMK    NILAI
M0197010  M01       3.0

Selanjutnya kita coba update untuk KODEMK yang ada dalam tabel MK. Misalnya akan diubah kode mk M01 menjadi M09.

UPDATE mk SET kodeMK = 'M09' WHERE kodeMK = 'M01';

Hasil query di atas pada tabel MK adalah

KODEMK    NAMAMK
M09       Database
M02       OOP

Nah… bila kita lihat data di tabel AMBILMK, pastilah isinya menjadi

NIM       KODEMK    NILAI
M0197010  M09       3.0

Bagaimana dengan proses penghapusan? Kita cek aja… sekarang kita coba hapus data mahasiswa berNIM M0197010 dalam tabel MHS.

DELETE FROM mhs WHERE nim = 'M0197010';

Hasil dari query SQL di atas pada tabel MHS adalah

NIM       NAMAMHS
M0197002  Dwi Amalia Fitriani
M0197003  Faza Fauzan
M0197004  Nada Hasanah
M0197005  Muh. Ahsani Taqwim

Sekarang bila kita lihat isi tabel AMBILMK, pastilah menjadi kosong karena data pengambilan matakuliah terkait dengan mahasiswa NIM M0197010 ini ikut terhapus.

OK… begitulah penjelasan ini saya tulis. Moga-moga bermanfaat bagi mahasiswaku semua… terus semangat belajar dan pantang menyerah. Indonesia sangat membutuhkanmu :-)




Share ke Facebook Share ke Twitter
Baca Juga Artikel Terkait
Perintah SQL (SELECT) untuk Multi Tabel (Bag. 1)
Perintah SQL (SELECT) untuk Multi Tabel (Bag. 2)
Penggunaan Subquery dalam Query SQL (Bag. 1)
Penggunaan Subquery dalam Query SQL (Bag. 2)
Beberapa Function Pengolah String di MySQL (Bag. 1)

Kata kunci: mysql -


Ada 39 komentar dalam artikel ini.



  1. ndasgodhog says:

    tutorial dari pak rosihan selalu aja bagus…

    udh lengkap beserta contoh+penjelasan yg mendetail, juga kata2 yang dipakai mudah dimengerti…

    terima kasih pak rosihan…

  2. ndasgodhog says:

    pak…mau tanya…di blog bapak ini ada tutorial Java juga???

    Saya sedang membuat Rekam Medis dengan menggunakan Java…mungkin ada tutorial dari bapak yang bisa membantu…
    terima kasih…

  3. suefi ajistama says:

    pak saya coba artikel, cara-membuat-foreign-key-relasi-tabel-dan-referential-integrity-di-phpmyadmin, tp pada store engine ga da innodb, gmana donk???

  4. Muh. Iqbal says:

    halo senior…,

    mohon saran yaaah?
    gimana cara/settingan ODBC pada komputer sebelah saya agar DataBase MySql saya dapat konnek/tampil pada saat kita mensetting ODBC Connector.

    thanks.

  5. Nugraha says:

    mw tnya,, klo di setiap relasi kan harus ada primary key??
    tp klo gk ada relasi nya gmn??

  6. Lucia says:

    very nice topic…..

    thanks a lot for the NICE info bout…

    ^————^

  7. asif says:

    Pak rosihan ary yang budiman,
    saya mau tanya berkaitan dengan referential integrity database.

    yang pertama, kelebihan dan kekurangan memakai integrity databse apa pak ya?dan pada kasus seperti apa hal ini digunakan??

    yang kedua, saya punya beberapa tabel yang berelasi secara integrity database. Apakah memang tidak dapat dilakukan update di child table nya??misalnya pada contoh diatas saya mau menambahkan field STATUS pada tabel ambilMK,yang berisi lulus atau tidak lulus dimana nilainya diproses pada code php, setelah didapatkan pada code php lalu diupdate ke tabel ambil MK, apajah bisa dilakukan seperti itu pak??
    mhon bimbingannya pak…

    terima kasih sebelumnya,
    salam

    • rosihanari says:

      @asif: kelebihan menggunakan Referential Integrity (RI) tentunya dalam sisi kekonsistenan data. Dengan RI dijamin data tidak ada yang redundant atau tidak konsisten, karena setiap perubahan di tabel parent maka seluruh data di child akan mengikuti baik itu proses update maupun delete. Meskipun tanpa RI pun bisa, namun terkadang bisa juga karena human error dari pihak programmer mengakibatkan data menjadi tidak konsisten. Untuk kasus yang bisa diterapkan RI, pada dasarnya bisa semua kasus asalkan terkait dengan relasi tabel. Untuk kelemahannya, yang pernah saya baca adalah kecepatan proses query yang sedikit lebih lambat dibandingkan tanpa RI, saya kira hal ini wajar karena setiap query yang diberikan di RI, DBMS harus bekerja ekstra keras untuk mengecek referential setiap data yang ada.

  8. Cutank says:

    tks ilmunya….

  9. aku says:

    thanks ya mbak

  10. Priatmoko says:

    Assalamualaykum ww, Pak Rosihanari, mohon maaf mohon pencerahannya. Saya membuat relasi2 diantara tabel yang berhubungan, awalnya sangat seneng karena jadi mudah menjaga data2 yang tidak boleh di delete, tapi masalah muncul ketika tidak bisa update tabel child (yang ada foreign key-nya) atau memang kalo memakai relasi di database tabel2nya jadi statis ya Pak artinya tidak bisa dirubah2 gitu? udah coba CASCADE, RESTRIC, NO ACTION, SET NULL, hasilnya kurang menggembirakan.
    Terima kasih

  11. Priatmoko says:

    Alhamdulillaah sudaj ketemu perasalahannya Pak, ternyata pake CASCADE, yang salah bukan di relasinya ternyata saya salah mengisi foreign key…. makasi PAk… :)

    Oiya kemarin saya ditempat kerja kan instal sms gateway yang reseller dari Bapak, kode di install.php mantab pak…

    semoga sukses Pak…

  12. agus says:

    saya mendapat pesan:
    Cannot add or update a child row: a foreign key constraint fails (`upt3`.`thasil_ujian`, CONSTRAINT `thasil_ujian_ibfk_2` FOREIGN KEY (`kd_plthn`) REFERENCES `tpelatihan` (`kd_plthn`) ON DELETE CASCADE ON UPDATE CASCADE)
    bagaimana solusina,gan?tq

  13. hm..
    1. Apakah foreign key harus terhubung ke Primary key?

    2. apakah type datanya juga harus sama?
    3. dan bagaimana caranya jika ada lebih dari 1 PK dalam tabel, mengingat ketika menggunakan phpmyadmin, maka saat seleksi FK ke relasinya yang terlihat hanya field dengan PK yang teratas saja

  14. pujik says:

    tutorial yg sangat bagus pak, salut insa alloh bisa jadi referensi baik deh ^-^



 

Komentar/pertanyaan Anda!

Mohon maaf, komentar/pertanyaan yang menggunakan email palsu atau komentar bernada negatif, cemooh, umpatan, cacian atau sejenisnya secara otomatis akan terhapus karena dianggap spam dan tidak akan tampil

Dimohon jangan pula memasukkan code program dalam bentuk apapun ke dalam komentar karena akan dianggap spam.

Mohon maaf jika seandainya ada beberapa pertanyaan Anda yang tidak direspon atau ditanggapi mengingat banyaknya komentar yang masuk dan keterbatasan kemampuan/ilmu saya dalam menjawab pertanyaan satu persatu. Saya harap Anda bisa memahami dan memakluminya.

Semua komentar atau pertanyaan yg masuk tidak akan langsung tampil di halaman ini, karena akan dimoderasi dahulu.


*