Apakah bisa membuat dua primary key di mysql

{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

Apakah boleh dalam satu tabel memiliki 2 primary key?

Kunci primer adalah bidang atau kumpulan bidang dengan nilai yang unik dalam tabel. Nilai dari kunci tersebut dapat digunakan untuk merujuk ke seluruh catatan karena setiap catatan memiliki nilai yang berbeda untuk kunci tersebut. Setiap tabel hanya dapat memiliki satu kunci primer.

Apakah primary key bisa lebih dari satu?

Syarat dari Primary Key Tabel hanya bisa memiliki satu kunci primer. Jumlah maksimal kunci primer yaitu 16 kolom dengan panjang kunci 900 byte. Kolom kunci utama perlu Anda definisikan “NOT NULL” yang artinya memastikan bahwa nilai dalam kolom tersebut tidak boleh kosong.

Berapa banyak primary key yang dapat dimiliki oleh sebuah tabel?

Primary Key disebut juga dengan Kunci Primer. Kunci utama dipilih sebagai pengidentifikasi untuk membedakan satu baris dalam tabel dari yang lain. Pada dasarnya, setiap tabel hanya memiliki satu kunci utama.

Mengapa sebuah primary key harus unique?

Selanjutnya mengenai PRIMARY KEY dan UNIQUE. Secara fungsi atau kegunaan, PRIMARY KEY dan UNIQUE keduanya sama-sama digunakan untuk menjamin bahwa tidak ada duplikasi data pada field tertentu. Selain itu, keduanya sama-sama digunakan untuk keperluan indexing.