Dapatkan CD MP3 Murottal Al Qur'an dan Terjemahnya. Satu-satunya di Indonesia!!
Ingin Punya Script SMS Gateway dengan PHP + MySQL?

Dapatkan segera phpSMS V3.0, software SMS Gateway multi fungsi berbasis web buatan saya sendiri untuk keperluan Anda.
[Info Lengkap...]

Foreign Key, Relationship dan Referential Integrity di MySQL


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

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 :-)

VN:F [1.9.3_1094]
Rating: 9.7/10 (6 votes cast)
Foreign Key, Relationship dan Referential Integrity di MySQL, 9.7 out of 10 based on 6 ratings
Anda ingin mendownload beberapa tool programming 100% gratis?
Silakan download di FREE PROGRAMMING TOOLS.
atau ingin berdonasi untuk pengembangan blog ini cukup dengan $1 via Paypal?



Beberapa artikel terkait


Share this article on:

Kata kunci: mysql -


Ada 29 komentar dalam artikel ini.

  1. idik says:

    sip baru tau aku mysql bisa ke gitu, selama ini hanya menggunakan script aja ! :D

    thx pak!

  2. [...] artikel sebelumnya, tentang tabel bertipe InnoDB dalam MySQL, saya sudah paparkan bagaimana cara membuat tabel bertipe InnoDB, mensetting field untuk foreign [...]

  3. agus says:

    Alhamdulillah,
    cape cari kesana kemari, jawabannya ada disini

  4. rosihanari says:

    to agus: he…3x makanya stay tune terus di blog ini mas agus.

  5. kris says:

    Wah sangat membantu…
    Yang ingin saya tanyakan apakah perubhan tersebut khususnya pada ON UPDATE CASCADE hanya terjadi pada FK yang terdapat pada ambilMK nya saja pak? Saya mencoba untuk membuat sebuah field baru pada tabel ambilMK yaitu namaMhs, ketika saya melakukan perubahan pda tabel mhs untuk field namaMhs ternyata pada table ambilMK field namaMhs tidak ikut berubah, atau memang demikian…
    Mohon pencerahaanya…

  6. rosihanari says:

    to Kris: Lho kok tabel ambilMK ada nama mahasiswa? kan sudah ada di tabel mhs sudah ada nama mahasiswa? Berarti nanti jadi redundant donk, kalo seperti itu rawan ketidakkonsistenan data.

  7. kris says:

    Hiii… iya pak.. saya lupa,
    Tanya lagi dunk pak…
    Misal kasusnya begini : Kalau ada hubungan one to many seperti kasus diatas, tapi diterapkan di database perpustakaan. Misal, dengan menerapkan ON DELETE UPDATE, maka ketika anggota a dihapus maka otomatis kan seluruh data di tabel peminjaman yang berhubungan dengan anggota a tersebut akan terhapus, (memang akan terjadi ketidak konsistensinan data dalam tabel peminjaman jika ON DELETE CASCADE tidak diterapkan), padahal data yang ada didalam tabel peminjaman akan diperlukan suatu saat karena untuk alasan tertentu, apakah saya tetap menggunakan ON DELETE CASCADE agar dapat menjaga konsistensi dan integritas dari data tersebut?
    Saya masih bingung kapan menggunakan ON DELETE CASCADE. Apakah wajib menggunakan ON DELETE CASCADE ?
    Terimakasih ….

  8. rosihanari says:

    to Kris: ON DELETE CASCADE itu sifatnya optional mas. Boleh pakai boleh tidak, sesuai kebutuhan. Kalau kasus Anda di atas berarti ya…. jangan pake ON DELETE CASCADE.

  9. kris says:

    Wah, terimakasih pak, sudah cerah rasanya…. He…
    Maju terus ya pak, ditunggu artikel2 terbaru….saya siap bertanya.. he..he….

  10. [...] di dalam MS. Access, kita bisa membuat Referential Integrity seperti halnya di MySQL. Namun belum dicoba apakah jika kita berlakukan hal ini di MS. Access, maka ada pengaruh ketika [...]

  11. yayan says:

    Ikut gabung & belajar ya Pak!
    Sy mau nanya nih Pak, bisa tidak tipe tabel INNODB ini di terapkan pada semua versi MySQL? atau hanya pada versi tertentu saja misalnya versi 5 ke atas.

  12. rosihanari says:

    to yayan: INNODB mulai dibundled ke dalam MySQL sejak versi 3.23 tapi pada waktu itu INNODB bersifat optional (bisa dienable atau tidak). Namun mulai pada MySQL 4.0, secara default INNODB dienabled. Hal ini berlaku sampai sekarang.

  13. Xth says:

    wah thx bgt atas inponya bro..

    masi newbie d bdang php neh..
    mohon bimbingannya.. :”>

  14. wei says:

    Ass. Pak Rosihan
    Saya mau tanya tentang primary key misalnya ada database AKADEMIK SMA,dmn ada tabel siswa ma tabel jenis nilai…
    Misal hub 2 tabel tsb many to many pastinya kan ada detail, Nac..Detailnya tu detail NILAI dmn berelasi dg tabel kelas,mata pelajaran,tahun ajaran.
    Pastinya ada Primary key dan Foreign key…
    Misalnya semua field jenis nilai,nis,mp,kelas,tahun ajaran dibuat PK sekalugus FK boleh gak??

  15. rosihanari says:

    to wei: sebaiknya anda gunakan Foreign Key. Karena Primary Key nya adalah di tabel siswa.

  16. wei says:

    Iyaw pak…
    Tabel jenis nilai,siswa,tahun ajaran,kelas,mata pelajaran sudah ada PKnya masing2.
    Kan jenis nilai ma siswa relasinya many to many otomatis kan PK 2 tabel tsb jd PK & FK pada tabel Detail Nilai,kemudian tabel detail nilai tak relasikan k Tabel tahun ajaran,kelas dan mata pelajaran dimana relasinya one to many .

    Maksudnya di tabel detail tu penyimpanan nilainya biar bisa menyimpan nilai dengan tahun ajaran,kelas,jenis nilai, mp, yang sama tapi untuk siswa yg berbeda dan juga sebaliknya menyimpan nilai dengan tahun ajaran,kelas,jenis nilai yang sama,tpi dg siswa yg NISnya berbeda dan jg untuk mp yg berbeda…

    Nac untuk bisa kayak gitu semua id dari tabel yg tak relasikan td langsung tak seting PK di databasenya…
    Itu bole gak????
    Klo gak di PK gak bisa nyimpen kyk td cz gak bs nyimpan nilai yg kembar/sama pak….
    Mohon penjelasannya….
    Saya lg bingung mengenai Apa diperbolehkan satu tabel byk PKnya kyk td???
    Tp PK tsb uda dari hasil relasi bukan ID mutlak dari tabel tsb…
    Terima Kasih

  17. rosihanari says:

    to wei: sebuah tabel bisa terdiri lebih dari satu PK. Biasanya tabel2 yang bertipe MyISAM (non InnoDB) implementasi FK adalah dengan PK juga. Jadi tidak ada masalah bila sebuah tabel terdiri lebih dari satu PK.

  18. wei says:

    iyaw pak makasi atas penjelasannya….?????
    Tp my ISAM tu apa?

  19. rosihanari says:

    to wei: MyISAM itu tipe tabel default dari MySQL. Penjelasan detailnya silakan baca di http://en.wikipedia.org/wiki/MyISAM

  20. Yogie says:

    Wah.. terima kasih artikelnya
    simpel dan mudah dipahami..
    .-= Yogie´s last blog ..Enkripsi E-mail Di Gmail Menggunakan FireGPG =-.

  21. Kus Andriadi says:

    sangat membantu…terima kasih….^^
    .-= Kus Andriadi´s last blog ..Kapan bisa upgrade komputer? hmmm…. =-.

  22. 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…

  23. 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…

  24. rosihanari says:

    to ndasgodhog: waduh… maaf mas saya blm pernah mencoba Java

  25. rosihanari says:

    to ndasgodhog: makasih mas…

  26. 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???

  27. 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.

  28. Nugraha says:

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

  29. Lucia says:

    very nice topic…..

    thanks a lot for the NICE info bout…

    ^————^



Tolong beri komentar donk!

Komentar Anda akan berguna untuk kemajuan blog ini.


Mohon maaf, komentar yang menggunakan email palsu atau komentar bernada negatif atau cemooh secara otomatis akan terhapus karena dianggap spam dan tidak akan tampil dalam daftar komentar.

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

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word