Foreign Key Di MySQL

Dalam relational basis data, terdapat istilah kunci utama (primary key) dan kunci tamu (foreign key). Tujuan utama dari adanya kedua istilah tersebut adalah pengidentifikasian tiap table dan kejelasan hubungan antara 2 atau lebih table. Primary key adalah satu atau beberapa kolom pada table yang mengidentifikasikan tiap kolom dan baris pada table tersebut. Sedangkan Foreign Key adalah satu atau beberapa kolom pada table yang merupakan primary key pada table satu namun diletakan pada table dimana tablenya berelasi dengan table dirinya.

relasi copy

Pada gambar diatas, nim pada table mhs adalah primary key. Sedangkan primary key pada table matkul adalah id_matkul. Lalu id_matkul menempel pada table mhs yang kita sebut sebagai foreign key.

Biasanya saya menyebut table yang berisi foreign key sebagai table anak karena table tersebut mengait pada table lain. Sedangkan table yang terkait saya sebut sebagai table induk. Pada contoh table di atas, mhs sebagai table anak sedangkan matkul sebagai table induk.
Contoh isi dari kedua table tersebut dapat dilihat dibawah ini.

Table mhs
Nim                  Nama                          Alamat                Id_matkul
10107644     Adiputra Artupida            Bekasi                      IF123
10107634     Hermansyah                     Bandung                 IF222
10107635     Budianto Nugroho            Semarang               IF111
10107636     Silan                                    Bekasi                      IF333

Table Matkul
Id_matkul        Nm_matkul                   Jml_sks
IF123                 Pemrograman Web         3
IF111                  Pemrograman C            3
IF222                Pemrograman Java          3
IF333                Pemrograman OOP          3

Saya langsung praktikan pada mysql. Berikut adalah codenya :

CREATE TABLE IF NOT EXISTS matkul(
id_matkul CHAR(5) NOT NULL PRIMARY KEY,
nm_matkul VARCHAR(30) NOT NULL,
jml_sks INT(3) NOT NULL
);

 

CREATE TABLE IF NOT EXISTS mhs(
nim CHAR(8) NOT NULL PRIMARY KEY,
nama VARCHAR(50) NOT NULL,
alamat VARCHAR(60) NOT NULL,
id_matkul CHAR(5),
FOREIGN KEY(id_matkul) REFERENCES matkul(id_matkul)
);

INSERT INTO mhs VALUES
(‘10107633′,’Adiputra Artupida’,’Bekasi’,’IF123′),
(‘10107634′,’Hermansyah’,’Bandung’,’IF222′),
(‘10107635′,’Budianto Nugroho’,’Semarang’,’IF111′),
(‘10107636′,’Silan’,’Bekasi’,’IF333′);

INSERT INTO matkul VALUES
(‘IF123′,’Pemrograman Web’,3),
(‘IF111′,’Pemrograman C’,3),
(‘IF222′,’Pemrograman Java’,3),
(‘IF333′,’Pemrograman OOP’,3);

mysql1

Perhatikan baris kode pada table mhs,

FOREIGN KEY(id_matkul) REFERENCES matkul(id_matkul)

Itulah cara mendefinikan foreign key pada mysql. Id_matkul didefinisikan sebagai foreign key yang mereferensikan(mengacu) pada table matkul pada kolom id_matkul.

Yang ingin saya fokus bicarakan pada artikel ini adalah bagaimana bila data matkul misalnya data dengan id_matkul=’IF123’ dihapus? Apakah data mahasiswa yang mengambil id_matkul akan dihapus juga atau akan dibiarkan apa adanya?

DELETE FROM matkul WHERE id_matkul=’IF123’

Maka pasti terjadi error

“Cannot delete or update a parent row: a foreign key constaint fails (‘test’.’mhs’,CONSTRAINT ‘mhs_ibfk_3’ FOREIGN KEY (‘id_matkul’) REFERENCES ‘matkul’ (‘id_matkul))

Maksudnya adalah tidak dapat menghapus atau mengupdate kolom pada table induk karena bereferensi pada table mhs.
Lalu bagaimana solusinya?

Pada MYSQL, kita harus menambahkan perintah ON DELETE [opsi] dan ON UPDATE [opsi]pada table yang mereferensikan foreign key. Opsi pada perintah tersebut jelasnya dibawah ini.

1. RESTRICT, Jika tabel anak berisi nilai dalam kolom yang mengkait yang nilainya sama dengan di kolom terkait pada tabel induk, baris dalam tabel induk tidak bisa dihapus, dan nilai di kolom terkait tidak dapat diupdate. Ini adalah opsi default jika klausa ON DELETE atau ON UPDATE tidak dispesifikasikan.

2. CASCADE, Baris-baris dalam tabel anak yang berisi nilai-nilai yang juga terdapat dalam kolom terkait dari tabel induk dihapus ketika barisbaris yang berkaitan dihapus dari tabel induk. Baris-baris dalam tabel anak yang berisi nilai-nilai yang juga terdapat dalam kolom terkait dari tabel induk diupdate ketika nilai-nilai yang berkaitan diupdate dalam tabel induk.

3. SET NULL, Nilai-nilai dalam kolom yang mengkait dari tabel anak diset ke NULL saat baris-baris dengan data terkait dalam tabel induk dihapus dari tabel induk atau ketika data terkait dalam tabel induk diupdate. Untuk menggunakan opsi ini, semua kolom-kolom yang mengkait dalam tabel anak harus mengijinkan nilai NULL.

4. NO ACTION Tidak ada aksi yang diambil dalam tabel anak ketika baris-baris dihapus dari tabel induk atau nilai-nilai dalam kolom terkait dalam tabel induk diupdate.

5. SET DEFAULT Nilai-nilai dalam kolom-kolom yang mengkait dari tabel anak diset ke nilai default mereka ketika baris-baris dihapus dari tabel induk atau kolom terkait dari tabel induk diupdate.

Ketika kita mendefinisikan foreign key dengan
FOREIGN KEY(id_matkul) REFERENCES matkul(id_matkul)
Maka perintah ON DELETE dan ON UPDATE nya ber-Opsi RESTRICT karena defaultnya dari references foreign key, yang artinya tidak boleh dihapus atau diupdate. Itulah yang menyebabkan error bila kita mendelete atau mengapdate table induk.

Coba sekarang kita ubah struktur table dari mhs dengan merubah references foreign key dengan opsi ON DELETE dan ON UPDATE CASCADE.

mysql2

Karena kita menggunakan OPSI CASCADE pada ON DELETE dan ON UPDATE nya maka bila kita menghapus salah satu kolom pada table induk maka table anak pun akan terhapus juga. Terlihat bahwa data mahasiswa yang bernama Adiputra Artupida dihapus karena Adiputra Artupida mengambil matkul dengan id ‘IF123’ dimana id tersebut telah dihapus pada table matkul.

Yang lainnya silakan improve sendiri. Saran kalau kita ingin merelasikan foreign key biasakan menggunakan perintah ON UPDATE dan ON DELETE dengan OPSI yang disesuaikan dengan kebutuhan.

About these ads

50 thoughts on “Foreign Key Di MySQL

  1. Ping-balik: Buat kunci tamu di PhpMyAdmin « Mari Terus Belajar Dan Berbagi

  2. ndk ada pesan eror ny mas. . .
    cma dilihat dari tabel master ny…

    biasany klo salah satu record dri tabel master di hapus,,,otomatis di tabel anak jga kehapus kan???
    tp yg ne sama sekali ngk kehapus. . .
    gmana tuh cerita ny???

  3. @ rifki buat databasenya pake PHPMyADMIN ato di MySQL Konsolnya???

    lihat perintah ondelete dan on updatenya kalo rifki buatnya di mysql konsol..

    tapi kalo rifki buatnya di PHPMyADMIN-nya..bisa dilihat tutor sederhananya di SINI

    moga membantu…

  4. kata bang “rifki oke”,benar itu mas.
    saya sendiri udah nyoba di phptriad tpi ngak jalan,,,
    masalhnya sama.
    saya mau nanya?,,mas pake webservernya apa??,XAMPP,WAMserver tau PHPtriad??
    mohon di bantu..

  5. kalau pake php triad baru bisa dijalankan mysql.exe nya, gmna caranya agar bisa menjalankan mysql.exe di xampp soalnya xampp yang saya pke gx bisa. klu boleh tau xampp yanga dipake versi berapa? thanx

  6. sy pake yg version 1.6.0 XAMPP,,

    klu mu main di command mysql..
    masuk ke cmd..
    ketik cd [diikuti nama path mysql]

    path mysql klu disy :
    C:\Program Files\xampp\mysql\bin

    lalu tinggal masuk aja..

    mysql -u root -papaajaboleh
    :)

  7. bukannya xampp versi terbarunya gx bisa menggunakan perintah command
    sekalipun menggunakan perintah
    C:\Program Files\xampp\mysql\bin
    saya sering mencoba ini berkali2.

  8. tuh ilmunya bermanfaat bgt,heheheee
    aku lagi buat database pke mysql tpi katanya duplicate column muluuuu….
    mksh infoonyaa.. keren :D

  9. artikelnya bagus sih cukup membantu, tapi kalau FOREIGN KEY yang di Ms. Access 2003 itu gmana ngebuatnya? saya tahunya membuat Primary Key nya tapi Foreign Key nya saya masih belum bisa buat (mungkin karena saya belum paham tentang itu kami ya), bisa terangin gimana caranya buat Foreign Key di table ms. access 2003 ga bro? makasih sebelumnya…

  10. Terimakasih Ilmunya sangat bermanfaat
    teapi ada sedikit yang ingin saya tanyakan
    saya mencoba query diatas di localhost dan itu berjalan dengan baik
    namun kenapa ketika saya lakukan hal yang sama di hosting query diatas tidak berfungsi

    dapat melakukan delete di tabel matkul namun data di tabel mhs tidak ikut terhapus

    terimakasih

Silahkan Komentar...

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

WordPress.com Logo

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

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s