Foreign key (kunci asing) adalah sebuah kolom atau sekumpulan kolom dalam satu tabel relasional yang merujuk pada primary key (kunci utama) di tabel lain. Fungsi utamanya adalah menjaga integritas referensial (referential integrity) antar-tabel dalam basis data relasional, memastikan bahwa data yang dimasukkan di tabel anak (child table) wajib memiliki pasangan data yang valid di tabel induk (parent table).
Tanpa penerapan foreign key yang tepat, basis data rentan mengalami inkonsistensi data, seperti munculnya catatan transaksi yang merujuk pada pelanggan fiktif atau produk yang sudah dihapus. Mekanisme ini mengikat dua entitas secara logis sehingga operasi penghapusan atau pembaruan data dapat dikendalikan secara otomatis melalui aturan pembatasan (constraints).
Fungsi Utama Foreign Key dalam Database
Penerapan foreign key bukan sekadar aturan formalitas desain basis data, melainkan pilar utama dalam menjaga keandalan sistem penyimpanan. Berikut adalah rincian fungsi krusialnya:
- Menjaga Integritas Referensial: Mencegah masuknya data asing atau tidak valid yang tidak memiliki relasi pada tabel referensi utamanya.
- Otomatisasi Aksi Relasi (Cascade Actions): Memungkinkan pengembang mengatur perilaku basis data saat data induk dihapus atau diperbarui, seperti
CASCADE,SET NULL, atauRESTRICT. - Mempermudah Normalisasi Data: Memungkinkan pemecahan tabel besar menjadi tabel-tabel kecil yang lebih spesifik tanpa kehilangan hubungan logis antar-informasi.
- Optimalisasi Join Query: Menjadi fondasi penghubung saat melakukan operasi penggabungan tabel (INNER JOIN, LEFT JOIN) dalam pengambilan laporan yang kompleks.
Tabel Matriks Perbedaan Primary Key vs Foreign Key
| Karakteristik | Primary Key | Foreign Key |
|---|---|---|
| Definisi | Pengidentifikasi unik untuk setiap baris dalam tabel. | Penghubung yang merujuk ke primary key pada tabel lain. |
| Nilai Unik | Wajib unik (tidak boleh ada duplikasi). | Boleh duplikat (mengacu pada nilai primary key tabel lain). |
| Nilai Kosong | Tidak boleh bernilai NULL (NOT NULL). |
Boleh bernilai NULL (kecuali diberi constraint NOT NULL). |
| Jumlah per Tabel | Hanya boleh ada 1 primary key per tabel. | Bisa lebih dari satu foreign key tergantung kebutuhan relasi. |
Contoh Implementasi SQL
Berikut adalah contoh sintaks pembuatan tabel relasional menggunakan MySQL yang menerapkan foreign key pada tabel orders yang merujuk ke tabel customers:
-- Membuat tabel induk (parent table)
CREATE TABLE customers (
customer_id INT AUTO_INCREMENT PRIMARY KEY,
customer_name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE
);
-- Membuat tabel anak (child table) dengan foreign key
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATE NOT NULL,
amount DECIMAL(10, 2),
customer_id INT,
CONSTRAINT fk_customer
FOREIGN KEY (customer_id)
REFERENCES customers(customer_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Aturan Aksi Penghapusan dan Pembaruan (Constraint Actions)
Saat mendefinisikan foreign key, pengembang dapat menentukan bagaimana basis data bereaksi ketika data pada tabel induk mengalami perubahan:
- CASCADE: Jika data induk dihapus atau diubah, seluruh data terkait di tabel anak akan ikut terhapus atau berubah secara otomatis.
- RESTRICT / NO ACTION: Menolak proses hapus atau ubah pada data induk jika masih ada data di tabel anak yang merujuk kepadanya.
- SET NULL: Mengubah nilai foreign key pada tabel anak menjadi
NULLjika data di tabel induk dihapus atau diubah. - SET DEFAULT: Mengatur nilai foreign key pada tabel anak ke nilai default yang telah ditentukan sebelumnya.
Tips Implementasi Lapangan
Pastikan kolom yang dijadikan foreign key memiliki tipe data, panjang karakter (length), dan unsigned attribute yang persis sama dengan kolom primary key yang diacu. Perbedaan tipe data kecil seperti INT(11) dengan BIGINT atau perbedaan tanda UNSIGNED seringkali menyebabkan eksekusi pembuatan foreign key gagal di tingkat sistem manajemen basis data (DBMS).