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ì.