Mengatasi Masalah Multiple Foreign Key di MySQL: Panduan Langkah-demi-Langkah

Saat bekerja dengan basis data, khususnya di MySQL, Anda mungkin menghadapi situasi di mana Anda perlu menerapkan beberapa kunci asing yang merujuk pada tabel induk yang sama. Ini bisa menjadi tantangan tersendiri, seperti yang dialami banyak pengguna, seperti mencoba mengaitkan berbagai pemasok dalam tabel detail pengiriman. Dalam posting ini, kita akan menjelajahi pertanyaan umum mengenai beberapa kunci asing, memberikan solusi terstruktur yang mencakup praktik terbaik, dan memandu Anda melalui proses pemecahan masalah.

Masalah

Bayangkan Anda memiliki tabel SHIPPING_DETAILS yang bertanggung jawab untuk melacak baik vendor pengiriman (seperti FedEx atau UPS) dan vendor penanganan produk (pikirkan Dunder Mifflin). Dalam situasi ini, beberapa kolom dalam detail pengiriman perlu merujuk pada tabel induk yang sama, yaitu VENDOR. Namun, masalah dapat muncul ketika Anda mencoba membuat pembatasan kunci asing untuk kolom-kolom ini, seperti tidak dapat mendefinisikan beberapa kunci asing.

Pengguna sering mengalami kesalahan seperti berikut:

Can't create table './<DB_NAME>/SHIPPING_GRID.frm' (errno: 150)

Kesalahan ini biasanya menandakan masalah dengan definisi kunci asing atau tipe data yang terlibat.

Gambaran Solusi

Untuk menyelesaikan masalah mendefinisikan beberapa kunci asing di MySQL, ikuti langkah-langkah berikut:

  1. Definisikan Struktur Tabel dengan Benar: Pastikan tabel VENDOR Anda memiliki kunci utama yang unik yang kompatibel dengan kolom kunci asing di tabel SHIPPING_DETAILS Anda.

  2. Perbaiki Tipe Tabel: Pastikan kedua tabel (VENDOR dan SHIPPING_GRID) bertipe InnoDB. Ini sangat penting karena pembatasan kunci asing tidak didukung dalam mesin penyimpanan lain seperti MyISAM.

  3. Pastikan Kompatibilitas Tipe Data: Verifikasi bahwa tipe data dari kunci asing cocok dengan tipe data dari kunci utama yang mereka rujuk. Misalnya, jika VENDOR.no didefinisikan sebagai INT(6), semua referensi kunci asing juga harus memiliki tipe yang sama.

  4. Hindari Definisi Kunci Utama Duplikat: Pastikan pernyataan SQL Anda tidak secara tidak sengaja menyertakan beberapa definisi kunci utama. Ini dapat menyebabkan kesalahan saat pembuatan tabel.

Contoh Kode

Berikut adalah contoh yang sudah diperbaiki tentang bagaimana tabel SHIPPING_GRID Anda dapat didefinisikan dengan benar setelah mempertimbangkan poin-poin di atas:

CREATE TABLE SHIPPING_GRID(  
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ID unik untuk setiap baris',
    shipping_vendor_no INT(6) NOT NULL COMMENT 'Kunci asing ke VENDOR.no untuk vendor pengiriman (vendors_type harus 3)',
    start_vendor_no INT(6) NOT NULL COMMENT 'Kunci asing ke VENDOR.no untuk vendor yang dikirim dari',
    end_vendor_no INT(6) NOT NULL COMMENT 'Kunci asing ke VENDOR.no untuk vendor yang dikirim ke',
    shipment_duration INT(1) DEFAULT 1 COMMENT 'Durasi dalam hari penuh yang diperlukan pengiriman',
    price FLOAT(5,5) NOT NULL COMMENT 'Harga dalam USD per lbs pengiriman (hingga 5 desimal)',
    is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1 jika tarif tetap terlepas dari berat, 0 jika harga berdasarkan lbs',
    INDEX (shipping_vendor_no),
    INDEX (start_vendor_no),
    INDEX (end_vendor_no),
    FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),
    FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),
    FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)  
) ENGINE=InnoDB;

Poin Penting

  • Tipe Data Penting: Selalu pastikan bahwa kolom kunci asing cocok dengan tipe data dari kunci utama yang dirujuk.
  • Gunakan InnoDB: Jika Anda mengatur kunci asing antar tabel, menggunakan mesin InnoDB sangat penting.
  • Hindari Duplikat: Jika Anda menemukan SQL Anda menghasilkan kesalahan, periksa kembali untuk definisi yang duplikat atau masalah sintaks.

Dengan mengikuti pedoman ini, Anda dapat dengan efektif membuat tabel Anda dengan beberapa kunci asing dan menghindari kesalahan umum yang terkait dengan pembatasan kunci asing. Semoga sukses dengan usaha MySQL Anda dan selamat berkoding!