Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL Membuat tabel dengan Kunci Asing memberikan errno:150

Saya memiliki masalah yang sama dengan ALTER TABLE ADD FOREIGN KEY .

Setelah satu jam, saya menemukan bahwa kondisi ini harus dipenuhi agar tidak mendapatkan kesalahan 150:

  1. Tabel Induk harus ada sebelum Anda menentukan kunci asing untuk mereferensikannya. Anda harus menentukan tabel dalam urutan yang benar:Tabel induk terlebih dahulu, lalu tabel Anak. Jika kedua tabel saling mereferensi, Anda harus membuat satu tabel tanpa batasan FK, lalu buat tabel kedua, lalu tambahkan batasan FK ke tabel pertama dengan ALTER TABLE .

  2. Kedua tabel harus mendukung batasan kunci asing, yaitu ENGINE=InnoDB . Mesin penyimpanan lain diam-diam mengabaikan definisi kunci asing, sehingga mereka tidak mengembalikan kesalahan atau peringatan, tetapi batasan FK tidak disimpan.

  3. Kolom yang direferensikan dalam tabel Induk harus kolom paling kiri dari kunci. Terbaik jika kunci di Induk adalah PRIMARY KEY atau UNIQUE KEY .

  4. Definisi FK harus mengacu pada kolom PK dalam urutan yang sama dengan definisi PK. Misalnya, jika FK REFERENCES Parent(a,b,c) maka PK Induk tidak boleh didefinisikan pada kolom dengan urutan (a,c,b) .

  5. Kolom PK di tabel Induk harus bertipe data yang sama dengan kolom FK di tabel Anak. Misalnya, jika kolom PK di tabel Induk UNSIGNED , pastikan untuk mendefinisikan UNSIGNED untuk kolom yang sesuai di bidang tabel Anak.

    Pengecualian:panjang string mungkin berbeda. Misalnya, VARCHAR(10) dapat mereferensikan VARCHAR(20) atau sebaliknya.

  6. Setiap kolom FK tipe string harus memiliki kumpulan karakter dan susunan yang sama dengan kolom PK yang sesuai.

  7. Jika sudah ada data di tabel Anak, setiap nilai di kolom FK harus cocok dengan nilai di kolom PK tabel Induk. Periksa ini dengan kueri seperti:

    SELECT COUNT(*) FROM Child LEFT OUTER JOIN Parent ON Child.FK = Parent.PK 
    WHERE Parent.PK IS NULL;
    

    Ini harus mengembalikan nol (0) nilai yang tidak cocok. Jelas, kueri ini adalah contoh umum; Anda harus mengganti nama tabel dan nama kolom Anda.

  8. Baik tabel Induk maupun tabel Anak tidak boleh berupa TEMPORARY tabel.

  9. Baik tabel Induk maupun tabel Anak tidak boleh berupa PARTITIONED tabel.

  10. Jika Anda mendeklarasikan FK dengan ON DELETE SET NULL pilihan, maka kolom FK harus nullable.

  11. Jika Anda mendeklarasikan nama batasan untuk kunci asing, nama batasan harus unik di seluruh skema, tidak hanya di tabel tempat batasan didefinisikan. Dua tabel mungkin tidak memiliki batasannya sendiri dengan nama yang sama.

  12. Jika ada FK lain di tabel lain yang menunjuk ke bidang yang sama yang Anda coba buat untuk FK baru, dan formatnya salah (yaitu susunan yang berbeda), mereka harus dibuat konsisten terlebih dahulu. Ini mungkin hasil dari perubahan sebelumnya di mana SET FOREIGN_KEY_CHECKS = 0; digunakan dengan hubungan yang tidak konsisten yang didefinisikan oleh kesalahan. Lihat jawaban @andrewdotn di bawah untuk petunjuk tentang cara mengidentifikasi masalah ini FK.

Semoga membantu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Membuat Database MySQL di cPanel

  2. Cara Mendapatkan Catatan dari Hari Ini di MySQL

  3. Basis Data Default MySQL

  4. Sintaks SQL TRUNCATE – Didaftarkan oleh DBMS

  5. Bisakah saya menggabungkan beberapa baris MySQL menjadi satu bidang?