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

ER_FK_NO_INDEX_PARENT:Gagal menambahkan batasan kunci asing. Tidak ada indeks untuk kendala

Pertama, cobalah untuk menganalisis dan memahami skema Anda. Saya tidak melihat alasan, mengapa teamname harus menjadi bagian dari kunci utama. ID kolom sudah unik karena AUTO_INCREMENT pilihan. Jadi Anda bisa menjadikannya sebagai kunci utama.

Sekarang analisis batasan pada teamname . Jika dua tim tidak dapat memiliki nama yang sama, maka Anda harus menentukan UNIQUE KEY batasan pada teamname . Jika setiap tim harus memiliki nama, maka Anda harus mendefinisikan NOT NULL batasan pada teamname . Dengan batasan ini teams dapat dibuat sebagai:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY (teamname )
);

Sekarang Anda dapat menggunakan teamname kolom untuk mengidentifikasi baris dalam teams tabel, dan dapat menggunakannya sebagai kunci asing di tabel lain. Kode Anda untuk players tabel sekarang seharusnya berfungsi (lihat demo ).

Perhatikan bahwa biasanya kunci asing mereferensikan kunci utama dari tabel lain. players tabel akan didefinisikan sebagai:

CREATE TABLE IF NOT EXISTS players (
  ID INT NOT NULL AUTO_INCREMENT,
  player_name VARCHAR(255),
  cm INT NOT NULL,
  team_id INT,
  PRIMARY KEY (ID),
  FOREIGN KEY (team_id) REFERENCES teams(ID)
);

Saat Anda perlu mengetahui nama tim dari seorang pemain, Anda akan menggunakan JOIN:

SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id

Catatan:Dalam beberapa hari terakhir saya telah melihat pertanyaan dengan pola yang sama berulang kali. Polanya adalah:Kunci asing yang mereferensikan bagian dari kunci utama di tabel lain. Beberapa contoh:

Komentar dan jawaban disarankan untuk mendefinisikan indeks sederhana pada tabel yang direferensikan untuk mendukung pemeriksaan kendala FK. Jangan lakukan itu! Pertimbangkan jika Anda mencoba memperbaiki masalah Anda hanya dengan mendefinisikan indeks pada teamname di teams tabel dengan:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  INDEX (teamname )
);

MySQL akan menerimanya (lihat demo ). Tetapi skema Anda mengizinkan dua tim dengan nama yang sama. Dengan asumsi Anda memiliki dua tim dengan nama "monyet". Dan Anda memiliki pemain yang memiliki "monyet" sebagai nama tim (FK). Manakah dari dua tim yang dirujuk? Anda tidak bisa mengatakannya! Jadi Anda lebih baik tetap berpegang pada aturan sederhana. Dan aturan untuk kunci asing adalah:Hanya referensi penuh UNIK atau KUNCI UTAMA. Atau bahkan lebih sederhana:Hanya referensi KUNCI UTAMA lengkap. Nilai kunci asing harus mengidentifikasi baris tertentu dalam tabel yang direferensikan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kerangka kerja entitas menambahkan kondisi tambahan di mana klausa

  2. Bagaimana cara menggunakan mysql_escape_string() dalam kerangka Yii?

  3. Kelola peringatan pengguna

  4. Bagaimana menemukan baris yang memiliki nilai yang berisi huruf kecil?

  5. Play framework 2.0.1 terus mencoba mengembangkan tipe database yang salah