productorder.oid
のように見えます は複数列の主キーの一部であり、主キーの左端の列ではありません。 (将来的には、SHOW CREATE TABLE <tablename>
の結果を含めてください 複数列のキーなどについては、DESCRIBEよりも明確だからです。)
外部キーを宣言するときは、主キーの左端の列を参照する必要があります。
複数列の主キーを参照する場合、外部キーには同じ順序で同じ数の列が必要です。
間違っています(列が足りず、主キーの2番目の列を参照しています):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (y INT, FOREIGN KEY (y) REFERENCES parent(y));
間違っています(それぞれが複合主キーの一部を参照している個々の外部キー):
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)
);
右(同じ列):
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));
コメントを再確認してください:
私は今、あなたの本当の問題はあなたが関係を逆転させていることだと思っています。 deliveryaddress
で外部キーを宣言しようとしています productorder
を参照する 、しかし、私は参照が反対方向に進むことを期待します。
ALTER TABLE productorder ADD FOREIGN KEY (oid) REFERENCES deliveryaddress (oid);
deliveryaddress
の主キーであるため、エラーは発生しません。 たった1列です。
この関係は、一般的なeコマースアプリケーションでより理にかなっていると思います。同じアドレスを参照する可能性のある注文が多数あります。多くの住所が単一の製品注文を参照することは意味がないため、反対の関係はおそらくあなたが望むものではありません。