Cara Menambahkan Kunci Asing di SQL
Kunci asing adalah atribut atau sekumpulan atribut yang merujuk ke kunci utama dari tabel yang sama atau tabel lain (relasi).
- Pembuatan kunci asing bersama dengan pembuatan tabel
Kunci asing dapat dibuat bahkan pada saat membuat tabel.
Sintaks:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Contoh:
Pertama, kita akan membuat database dengan nama “employeedb ”. Kemudian dalam database tersebut kita akan membuat dua tabel “karyawan” dan “departemen”. Kami akan mempertimbangkan tabel dan database ini untuk semua contoh berikutnya.
Kami akan membuat kunci utama dan kunci asing saat membuat tabel "karyawan" dan "departemen".
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.07 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | Emp_ID | int(11) | NO | PRI | NULL | | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+-------+ 3 rows in set (0.09 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL, FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID)); Query OK, 0 rows affected (0.20 sec) mysql> DESC department; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | Dept_ID | int(11) | NO | PRI | NULL | | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+-------+ 3 rows in set (0.02 sec)
Kami telah membuat dua kunci utama "Emp_ID" ke tabel "karyawan", "Dept_ID" ke tabel "departemen" dan "Emp_ID" sebagai kunci asing ke tabel "departemen" saat membuat tabel. Untuk memverifikasi apakah kunci ditambahkan ke tabel atau tidak, kami telah menggunakan perintah DESC.
- Pembuatan kunci asing dengan nama batasan
Kunci asing dapat dibuat bahkan pada saat membuat tabel bersama dengan nama batasan. Nama kendala ini akan berguna saat menjatuhkan kunci asing dari tabel tanpa menjatuhkan seluruh tabel.
Sintaks:
CREATE TABLE tablename(ColumnName1 Datatype(SIZE) PRIMARY KEY, ColumnNameN Datatype(SIZE), CONSTRAINT ConstraintName FOREIGN KEY( ColumnName ) REFERENCES PARENT_TABLE_NAME(Primary_Key_ColumnName));
Contoh:
Kami akan membuat kunci utama dan kunci asing saat membuat tabel "karyawan" dan "departemen". Kunci asing akan dibuat bersama dengan batasan kunci asing saat membuat tabel itu sendiri.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.11 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+-------+ | Emp_ID | int(11) | NO | PRI | NULL | | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+-------+ 3 rows in set (0.01 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL, CONSTRAINT emp_id_fk FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID)); Query OK, 0 rows affected (0.25 sec) mysql> DESC department; +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | Dept_ID | int(11) | NO | PRI | NULL | | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+-------+ 3 rows in set (0.04 sec)
Kami telah membuat dua kunci utama "Emp_ID" ke tabel "karyawan", "Dept_ID" ke tabel "departemen" dan "Emp_ID" sebagai kunci asing ke tabel "departemen" saat membuat tabel. Di sini, kami juga menambahkan batasan kunci asing bernama "emp_id_fk". Untuk memverifikasi apakah kunci ditambahkan ke tabel atau tidak, kami telah menggunakan perintah DESC.
- Pembuatan kunci asing menggunakan perintah ALTER
Dimungkinkan untuk membuat kunci asing bahkan setelah pembuatan tabel. Saat membuat tabel jika kita belum menambahkan kunci asing ke dalamnya dan setelah itu kita perlu menambahkan kunci asing ke tabel yang ada maka kita akan menggunakan perintah ALTER dalam kasus itu.
Sintaks:
ALTER TABLE Parent_TableName ADD FOREIGN KEY(ColumnName) REFERENCES Child_TableName(ColumnName);
Contoh:
Kami akan menambahkan kunci asing ke tabel yang ada menggunakan perintah ALTER.
mysql> USE employeedb; Database changed mysql> CREATE TABLE employee(Emp_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Emp_Name VARCHAR(40), Emp_Salary VARCHAR(40)); Query OK, 0 rows affected (0.16 sec) mysql> DESC employee; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | Emp_ID | int(11) | NO | PRI | NULL | auto_increment | | Emp_Name | varchar(40) | YES | | NULL | | | Emp_Salary | varchar(40) | YES | | NULL | | +------------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec) mysql> CREATE TABLE department(Dept_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Dept_Name VARCHAR(40), Emp_ID INT NOT NULL); Query OK, 0 rows affected (0.12 sec) mysql> ALTER TABLE department ADD FOREIGN KEY(Emp_ID) REFERENCES employee(Emp_ID); Query OK, 0 rows affected (0.23 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC department; +-----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+----------------+ | Dept_ID | int(11) | NO | PRI | NULL | auto_increment | | Dept_Name | varchar(40) | YES | | NULL | | | Emp_ID | int(11) | NO | MUL | NULL | | +-----------+-------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec)
Kami telah membuat dua kunci utama "Emp_ID" ke tabel "karyawan" dan "Dept_ID" ke tabel "departemen" saat membuat tabel. Kemudian menggunakan perintah ALTER kami telah menambahkan "Emp_ID" sebagai kunci asing ke tabel departemen. Untuk memverifikasi apakah kunci ditambahkan ke tabel atau tidak, kami telah menggunakan perintah DESC.