Senin, 24 Januari 2011

Tugas Database Lanjut (Foreign key)

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.
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);


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.


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.
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);


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.


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.

Sumber
http://terusbelajar.wordpress.com/2009/11/13/foreign-key-di-mysql/

Rabu, 05 Januari 2011

MI resmi sebagai Official Fans Club Milan

Pada hari Jumat (15 oktober 2010) Milanisti Indonesia, yang diwakilkan oleh Toel, Reza Razer, dan Andri, berkesempatan untuk berkunjung ke sekertariat resmi AIMC (Associazione Italiana Milan Club) di Stadion San Siro, Milan. AIMC merupakan organisasi resmi Milan Fans Club di bawah naungan langsung AC Milan. Perwakilan MI disambut dengan hangat oleh Signore Carlo, Signore Vincenzo, dan Signora Arabella dari AIMC. Pada kesempatan tsb, Toel dkk menjelaskan segala sesuatu tentang MI antara lain kegiatan rutin serta sezione yang tercakup di Indonesia. Selain itu juga diserahkan kelengkapan administrasi serta cinderamata dari Indonesia kepada AIMC berupa syal dan polo shirt MI. Selanjutnya pihak AIMC yang diwakilkan oleh signore Carlo mengajak Toel, Reza, dan Andri untuk berkeliling Stadion San Siro dimulai dari Curva Nord, VIP dan Curva Sud serta San Siro store.
Pagi hari di tanggal 18 Oktober 2010, perwakilan MI bersama dengan rombongan tim MJC Indonesia mengunjungi Stasion San Siro untuk melakukan tour stadion. Setelah dilakukannya tour,  Toel dkk langsung menuju ke sekertariat AIMC kembali untuk bertemu dengan signora Arabella dan ternyata disana sudah menunggu presiden AIMC signore Alesandro Capitano. Dengan sangat antusias mereka menyambut kembali sambil menyerahkan bukti surat resminya bahwa MI sudah resmi bergabung dalam keluarga besar AIMC dengan no register/code (Al vostro club e stato assegnato I'll numero di codice : 310200 ) sekaligus fasilitas lainnya.
Dengan adanya surat resmi tersebut bahwa Milanisti Indonesia per tanggal 18 Oktober 2010 sudah resmi sebagai Official Fans Club Milan dan tercatat resmi di Italia. Rasa syukur kepada Tuhan serta ucapan terima kasih terdalam untuk perwakilan MI (Toel, Reza, dan Andri), para member, founder, dan seluruh milanisti yang ada di Indonesia atas dukungan dan doanya sehingga apa yang kita semua inginkan dapat tercapai.
Semoga hal ini dapat dijadikan MI dan seluruh entitas didalamnya sebagai titik tolak agar dapat lebih baik, lebih solid, kompak, dan lebih semangat dengan tetap berlandaskan rasa kekeluargaan...

Forza Milanisti Indonesia...!!

sumber : http://sito.milanisti.or.id/berita-kegiatan/berita/berita-2010/52-aimc.html

Pengikut

Total Tayangan Halaman