Trước tiên, hãy cố gắng phân tích và hiểu lược đồ của bạn. Tôi không hiểu lý do, tại sao teamname
phải là một phần của khóa chính. ID
cột đã là duy nhất do AUTO_INCREMENT
quyền mua. Vì vậy, bạn có thể đặt nó thành khóa chính.
Bây giờ hãy phân tích các ràng buộc trên teamname
. Nếu hai nhóm không thể có cùng tên, thì bạn nên xác định một UNIQUE KEY
ràng buộc về teamname
. Nếu mọi nhóm phải có tên, thì bạn nên xác định NOT NULL
ràng buộc về teamname
. Với những ràng buộc này, các nhóm teams
có thể được tạo dưới dạng:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
UNIQUE KEY (teamname )
);
Bây giờ bạn có thể sử dụng teamname
để xác định một hàng trong teams
bảng, và có thể sử dụng nó làm khóa ngoại trong các bảng khác. Mã của bạn cho players
bây giờ bảng sẽ hoạt động (xem bản trình diễn
).
Lưu ý rằng thông thường một khóa ngoại tham chiếu đến khóa chính của một bảng khác. players
bảng sẽ được định nghĩa là:
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)
);
Khi bạn cần biết tên đội của một cầu thủ, bạn sẽ sử dụng THAM GIA:
SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id
Lưu ý:Trong vài ngày qua, tôi đã thấy các câu hỏi có cùng một mẫu lặp đi lặp lại. Mẫu là:Một khóa ngoại tham chiếu đến một phần của khóa chính trong bảng khác. Một số ví dụ:
- sự cố là gì với các bảng của tôi trong mysql?
- Mã lỗi :1822. Không thêm được ràng buộc khóa ngoại
- # 1005 (errno :150 “Ràng buộc khóa ngoại được định dạng không chính xác”)
Nhận xét và câu trả lời được đề xuất để xác định một chỉ mục đơn giản trên bảng được tham chiếu để hỗ trợ kiểm tra ràng buộc FK. Đừng làm vậy! Hãy xem xét nếu bạn cố gắng khắc phục sự cố của mình bằng cách chỉ xác định một chỉ mục trên teamname
trên teams
bảng với:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
INDEX (teamname )
);
MySQL sẽ chấp nhận điều đó (xem bản trình diễn ). Nhưng lược đồ của bạn cho phép hai nhóm có cùng tên. Giả sử bạn có hai đội với tên "khỉ". Và bạn có một người chơi có "khỉ" là tên đội (FK). Ai trong hai đội được tham chiếu? Bạn không thể nói! Vì vậy, tốt hơn bạn nên tuân thủ các quy tắc đơn giản. Và quy tắc cho các khóa ngoại là:Chỉ tham chiếu đầy đủ CÁC KHÓA DUY NHẤT hoặc CHÍNH XÁC. Hoặc đơn giản hơn:Chỉ tham khảo đầy đủ CÁC KHÓA CHÍNH. Giá trị khóa ngoại phải xác định một hàng cụ thể trong bảng được tham chiếu.