Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

ER_FK_NO_INDEX_PARENT:Không thêm được ràng buộc khóa ngoại. Thiếu chỉ mục cho ràng buộc

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ụ:

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL thành định dạng outfile

  2. 'pip install MySQL-python' không thành công với 'IndexError'

  3. Trình kết nối MySQL C ++:Lấy insert_id

  4. Lỗi MySQL Chỉ có thể có một cột TIMESTAMP với CURRENT_TIMESTAMP trong mệnh đề DEFAULT mặc dù tôi không làm gì sai

  5. WebSecurity.CreateAccount không thành công cho MySQL