sql >> Base de Datos >  >> RDS >> Mysql

No se puede agregar una clave externa en MySQL 5.7 (restricción faltante en la tabla a la que se hace referencia)

Se parece a productorder.oid es parte de una clave principal de varias columnas y no es la columna más a la izquierda de la clave principal. (En el futuro, incluya el resultado de SHOW CREATE TABLE <tablename> porque es más claro que DESCRIBE sobre cosas como claves de varias columnas).

Cuando declara una clave externa, debe hacer referencia a la columna más a la izquierda de la clave principal.

Cuando hace referencia a una clave principal de varias columnas, la clave externa debe tener el mismo número de columnas en el mismo orden.

Incorrecto (no hay suficientes columnas y hace referencia a la segunda columna de la clave principal):

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

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

Incorrecto (claves foráneas individuales, cada una de las cuales hace referencia a una parte de la clave primaria compuesta):

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)
);

Derecha (mismas columnas):

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 tu comentario:

Ahora estoy pensando que tu verdadero problema es que tienes la relación al revés. Está intentando declarar una clave externa en deliveryaddress haciendo referencia a productorder , pero esperaría que la referencia fuera en la otra dirección.

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

Entonces no tiene ningún error, porque la clave principal de deliveryaddress es solo una columna.

Creo que esta relación tiene más sentido en una aplicación típica de comercio electrónico. Hay muchos pedidos que pueden hacer referencia a la misma dirección. La relación opuesta probablemente no sea lo que desea, porque no tiene sentido que muchas direcciones hagan referencia a un solo pedido de producto.