Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Não é possível adicionar chave estrangeira no MySQL 5.7 (falta de restrição na tabela referenciada)


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.