{tocify} $title={Daftar Isi}
Pendahuluan:
Foreign key pada mysql digunakan untuk membangun dan menjaga hubungan antar dua tabel atau lebih, tabel dengan foreign key disebut child table dan tabel referensinya disebut sebagai parent table. Ketika akan membuat foreign key diperlukan kolom yang akan menyimpan data berdasarkan tabel referensi (parent). Pembahasan mengenai foreign key dapat dicari dan dibaca melalui halaman daftar isi.
Create Table
Cara pertama untuk membuat foreign key adalah pada saat mendefinisikan tabel, kita dapat langsung membuat/menambahkan foreign key di dalamnya dengan format dan contohnya sebagai berikut:
Format:
create table nama_tabel (nama_kolom tipe_data(length)..., foreign key (nama_kolom) references nama_tabel_referensi (nama_kolom_referensi));
create table nama_tabel (nama_kolom tipe_data(length)..., constraint nama_constraint foreign key (nama_kolom) references nama_tabel_referensi (nama_kolom_referensi));
Contoh:
mysql> create table dosen (id_dosen int primary key auto_increment, nid char(8), nama varchar(65), j_kel enum("L","P"), t_lahir date, alamat varchar(50), kota varchar(50), telepon char(12), email varchar(50));
Query OK, 0 rows affected (0.12 sec)
mysql> create table gaji (id_gaji int primary key auto_increment, dosen_id int, kontrak char(9), gaji_pokok varchar(14), tunjangan varchar(14), lembur varchar(14), foreign key (dosen_id) references dosen (id_dosen));
Query OK, 0 rows affected (0.21 sec)
mysql> create table gaji (id_gaji int primary key auto_increment, dosen_id int, kontrak char(9), gaji_pokok varchar(14), tunjangan varchar(14), lembur varchar(14), constraint fk_dosen foreign key (dosen_id) references dosen (id_dosen));
Query OK, 0 rows affected (0.22 sec)
Jika saat mendefinisikan tabel sementara nama constraint untuk foreign key tidak didefinisikan maka akan diberi nama secara default yang mana nama constraintnya dapat dilihat dengan menjalankan perintah show create table nama_tabel.
Alter Table
Cara kedua untuk membuat/menambahkan foreign key adalah dengan menjalankan alter table, ini dilakukan jika pada saat mendefinisikan table kita lupa untuk memberikan foreign key. Format dan contohnya sebagai berikut:
Format:
alter table nama_tabel add foreign key (nama_kolom) references nama_tabel_referensi (nama_kolom_referensi);
alter table nama_tabel add constraint nama_constraint foreign key (nama_kolom) references nama_tabel_referensi (nama_kolom_referensi);
Contoh:
mysql> alter table gaji add foreign key (dosen_id) references dosen (id_dosen);
Query OK, 0 rows affected (0.23 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table gaji add constraint FK_dosen foreign key (dosen_id) references dosen (id_dosen);
Query OK, 0 rows affected (0.28 sec)
Records: 0 Duplicates: 0 Warnings: 0
Menghapus Foreign Key
Kita juga dapat menghapus foreign key di mana ada beberapa alasan ketika foreign key perlu dihapus:
- Ingin menghapus parent table
- Merubah/memodifikasi kolom referensi pada parent table
Format dan contohnya sebagai berikut:
Format:
alter table nama_tabel drop foreign key nama_constraint
alter table nama_tabel drop constraint nama_constraint;
Contoh:
mysql> alter table gaji drop foreign key FK_dosen;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table gaji drop constraint FK_dosen;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
Merubah Parent Tabel
Jika pada suatu waktu parent table perlu dimodifikasi terutama pada kolom yang menjadi referensi dari child tabel maka kita perlu menghapus foreign key terlebih dahulu untuk dapat menjalankan operasi alter table pada table parent. Contohnya penulis memiliki tabel seperti berikut:
mysql> desc dasen;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| id_disen | int | NO | PRI | NULL | |
| nid | char(8) | YES | | NULL | |
| nama | varchar(65) | YES | | NULL | |
| j_kel | enum('L','P') | YES | | NULL | |
| t_lahir | date | YES | | NULL | |
| alamat | varchar(50) | YES | | NULL | |
| kota | varchar(50) | YES | | NULL | |
| telepon | char(12) | YES | | NULL | |
| email | varchar(50) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
9 rows in set (0.01 sec)
mysql> desc gaji;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id_gaji | int | NO | PRI | NULL | auto_increment |
| dosen_id | int | YES | MUL | NULL | |
| kontrak | char(9) | YES | | NULL | |
| gaji_pokok | varchar(14) | YES | | NULL | |
| tunjangan | varchar(14) | YES | | NULL | |
| lembur | varchar(14) | YES | | NULL | |
+------------+-------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
Asumsikan pada tabel parent (dasen) penulis salah memberi nama tabel yang seharusnya menjadi dosen serta kolom id_disen yang seharusnya id_dosen dan penulis juga lupa untuk menambahkan atribut auto_increment pada kolom id_disen sehingga harus menambahkkannya, maka penulis perlu menjalankan perintah alter table, contohnya seperti berikut:
mysql> alter table dasen rename to dosen;
Query OK, 0 rows affected (0.06 sec)
mysql> alter table dosen rename column id_disen to id_dosen;
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table dosen change id_dosen id_dosen int auto_increment;
ERROR 1833 (HY000): Cannot change column 'id_dosen': used in a foreign key constraint 'fk_dosen' of table 'latihan2.gaji'
Dapat dilihat bahwa penulis dapat mengganti nama tabel dan kolom pada tabel dasen namun tidak bisa menambahkan atribut auto_increment karena kolom tersebut menjadi referensi dari untuk child table (gaji), dengan demikian kita perlu menghapus foreign key terlebih dahulu dari child table sehingga dapat memodifikasi kolom id_dosen, contohnya seperti berikut:
mysql> alter table gaji drop constraint FK_dosen;
Query OK, 0 rows affected (0.27 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table dosen change id_dosen id_dosen int auto_increment;
Query OK, 0 rows affected (0.31 sec)
Records: 0 Duplicates: 0 Warnings: 0
Untuk mencegah permasalahan serupa kita perlu memahami karakteristik dari foreign key, diantaranya sebagai berikut:
- Hanya dapat mengambil referensi dari satu tabel saja
- Kolom dengan foreign key dapat berisi duplikasi data selama tidak menambahkan constraint unique
- Foreign key hanya dapat mengambil referensi dari kolom unik / primary key pada parent tabel
- Tipe data yang digunakan pada child table harus sama dengan parent table