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:
- apa masalahnya dengan tabel saya di mysql?
- Kode Kesalahan :1822. Gagal menambahkan batasan kunci asing
- #1005 (errno :150 “Foreign key constraint salah dibentuk”)
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.