Parece
productorder.oid
faz parte de uma chave primária de várias colunas e não é a coluna mais à esquerda na chave primária. (No futuro, inclua o resultado de SHOW CREATE TABLE <tablename>
porque é mais claro do que DESCRIBE sobre coisas como teclas de várias colunas.) Ao declarar uma chave estrangeira, você deve fazer referência à coluna mais à esquerda da chave primária.
Quando você faz referência a uma chave primária de várias colunas, a chave estrangeira deve ter o mesmo número de colunas na mesma ordem.
Errado (colunas insuficientes e referência à segunda coluna da chave primária):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (y INT, FOREIGN KEY (y) REFERENCES parent(y));
Errado (chaves estrangeiras individuais, cada uma referenciando parte da chave primária composta):
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)
);
Direita (mesmas colunas):
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));
Re seu comentário:
Agora estou pensando que seu verdadeiro problema é que você inverteu o relacionamento. Você está tentando declarar uma chave estrangeira em
deliveryaddress
referenciando productorder
, mas eu esperaria que a referência fosse na outra direção. ALTER TABLE productorder ADD FOREIGN KEY (oid) REFERENCES deliveryaddress (oid);
Então você não tem erro, porque a chave primária de
deliveryaddress
é apenas uma coluna. Acredito que essa relação faça mais sentido em uma aplicação típica de e-commerce. Existem muitos pedidos que podem fazer referência ao mesmo endereço. A relação oposta provavelmente não é o que você deseja, porque não faz sentido que muitos endereços façam referência a um único pedido de produto.