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

Không thể thêm khóa ngoại trong MySQL 5.7 (Thiếu ràng buộc trong bảng được tham chiếu)

Có vẻ như productorder.oid là một phần của khóa chính nhiều cột và nó không phải là cột ngoài cùng bên trái trong khóa chính. (Trong tương lai, vui lòng bao gồm kết quả của SHOW CREATE TABLE <tablename> vì nó rõ ràng hơn DESCRIBE về những thứ như khóa nhiều cột.)

Khi bạn khai báo khóa ngoại, bạn phải tham chiếu đến cột ngoài cùng bên trái của khóa chính.

Khi bạn tham chiếu khóa chính nhiều cột, khóa ngoại phải có cùng số cột theo cùng một thứ tự.

Sai (không đủ cột và tham chiếu đến cột thứ hai của khóa chính):

CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));

CREATE TABLE child  (y INT, FOREIGN KEY (y) REFERENCES parent(y));

Sai (các khóa ngoại riêng lẻ từng tham chiếu đến phần của khóa chính tổng hợp):

CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));

CREATE TABLE child  (x INT, y INT, 
  FOREIGN KEY (x) REFERENCES parent(x),
  FOREIGN KEY (y) REFERENCES parent(y)
);

Bên phải (các cột giống nhau):

CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));

CREATE TABLE child  (x INT, y INT, FOREIGN KEY (x, y) REFERENCES parent(x, y));

Nhận xét lại của bạn:

Bây giờ tôi đang nghĩ rằng vấn đề thực sự của bạn là bạn có mối quan hệ bị đảo ngược. Bạn đang cố gắng khai báo khóa ngoại trong deliveryaddress tham chiếu đến productorder , nhưng tôi mong rằng tham chiếu sẽ đi theo hướng khác.

ALTER TABLE productorder ADD FOREIGN KEY (oid) REFERENCES deliveryaddress (oid);

Sau đó, bạn không có lỗi, vì khóa chính của deliveryaddress chỉ là một cột.

Tôi tin rằng mối quan hệ này có ý nghĩa hơn trong một ứng dụng thương mại điện tử điển hình. Có nhiều đơn đặt hàng có thể tham chiếu đến cùng một địa chỉ. Mối quan hệ ngược lại có thể không phải là điều bạn muốn, vì nhiều địa chỉ tham khảo đơn đặt hàng một sản phẩm không có ý nghĩa gì.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Điều gì đang xảy ra với chuỗi khớp trường số nguyên MySQL?

  2. Cách tốt nhất để sử dụng LEFT OUTER JOIN để kiểm tra sự không tồn tại của các hàng liên quan là gì

  3. MySQL, nhiều hàng thành các trường riêng biệt

  4. Sử dụng kết nối liên tục PHP-MySQL để chạy blog WordPress

  5. MySql - đặt hàng theo giá trị chuỗi đầu tiên