TransWikia.com

Error 1822: Failed to Add foreign key constraint Missing index for constraint

Stack Overflow en español Asked by ADRIAN LEON ORTEGA on December 25, 2020

Estoy haciendo un script sobre una libreria y todas las tablas estan relacionadas, me crea la base de datos correctamente pero de ejecutar la parte del Alter presenta problema en uno que corresponde a la tabla LibrosEstado:

create database libreria;
use libreria;
create table LibrosEstado(
EstadoLibroID   char(8) primary key,
NombreEdo   varchar(15) not null,
Descripcion varchar(25)  null);
create table Libro(
LibroID char(8) primary key,
Titulo  varchar(30) not null,
Editorial   varchar(20) not null,
Seccion varchar(25) not null,
FechaPublicacion    date    null,
FechaEdicion    date    null,
PrecioEntrada   float(4)    not null,
PrecioSalida    float(4)    not null,
EstadoLibroID   char(8) not null,
Venido  bit(1)  not null);
create table Autor(
AutorID char(8) primary key,
Nombre  varchar(25) null,
Apellido    varchar(25) not null,
PaisOrigen  varchar(20) null,
Nacio   int(4)  null,
Murio   int(4)  null,
Descripcion varchar(50) null);
create table AutorLibro(
AutorID char(8) primary key,
LibroID char(8) not null);
create table cargo(
CargoID char(8) primary key,
Cargo   varchar(20) not null,
Descripcion varchar(50) null);
create table Empleado(
EmpleadoID  char(8) primary key,
Nombre  varchar(25)  null,
Apellido    varchar(25)  null,
Direccion   varchar(50)  null,
Ciudad  varchar(20)  null,
Estado  varchar(20)  null,
CP  char(5) null,
Telefono    varchar(20) null,
FechaIngreso    date     null,
CargoID char(8)  null);
create table FormaPago(
FormaPagoID char(8) primary key,
Descripcion varchar(50) null);
create table OrdenEstado(
EstadoOrdenID   char(8) primary key,
Descripcion varchar(50) null);
create table Cliente(
ClienteID   char(10)    primary key,
Nombre  varchar(25) not null,
Apellido    varchar(25) not null,
Telefono    varchar(20) null,
Direccion   varchar(50) null,
Ciudad  varchar(20) null,
Estado  varchar(20) null,
CP  char(5) not null);
create table Orden(
OrdenID char(8) primary key,
EmpleadoID  char(8) null,
ClienteID   char(8) null,
FechaOrden  date    null,
FechaEnvio  date    not null,
MontoVenta  float   null,
FormaPagoID char(8) null,
EstadoOrdenID char(8)   null);
create table OrdenLibro(
OrdenID char(8) primary key,
LibroID char(8) not null);


alter table AutorLibro add foreign key (LibroID) references Libro (LibroID);
alter table LibrosEstado add foreign key (EstadoLibroID) references Libro (EstadoLibroID);
alter table AutorLibro add foreign key (AutorID) references Autor (AutorID);
alter table OrdenLibro add foreign key (LibroID) references Libro (LibroID);
alter table OrdenLibro add foreign key (OrdenID) references Orden (OrdenID);
alter table OrdenLibro add foreign key (LibroID) references Libro (LibroID);
alter table Orden add foreign key (ClienteID) references Cliente (ClienteID);
alter table Empleado add foreign key (CargoID) references Cargo (CargoID);
alter table Orden add foreign key (EstadoOrdenID) references OrdenEstado (EstadoOrdenID);
alter table Orden add foreign key (FormaPagoID) references FormaPago (FormaPagoID);

y me aparece el siguiente error:

“alter table LibrosEstado add foreign key (EstadoLibroID) references
Libro (EstadoLibroID) Error Code: 1822. Failed to add the foreign key
constraint. Missing index for constraint ‘librosestado_ibfk_1’ in the
referenced table ‘libro'”

He intentado hacer varios cambios y pero no consigo arreglar ese error, ni ingresar los datos de ninguna tabla me permite hasta que este correctamente esa parte del codigo

2 Answers

De esta manera este error es relacionado a que primero creas la tabla LibrosEstado y luego la tabla Libro cuando debería ser al revés por que tu llave foránea que vive en LibrosEstado apunta a la declaración de una tabla que aún no existe, en este caso Libro.

El ALTER TABLE donde agregas la llave foránea que vincula LibrosEstado con Libro tiene el error de que la misma llave foránea que declaras des decir su nombre, es el mismo nombre de columna que usas para indicar la llave primaria; es decir con la llave foránea de LibrosEstado estas apuntando a la llave primaria de la misma tabla LibrosEstado cuando debería ser a la columna LibroID introducir la descripción de la imagen aquí

Answered by ISABEL BOTELLO MANCILLA on December 25, 2020

Tienes los siguientes errores:

  • Estas creando primero la tabla LibrosEstado y luego la tabla Libro cuando debería ser al revés por que tu llave foránea que vive en LibrosEstado apunta a la declaración de una tabla que aún no existe, en este caso Libro.
  • El ALTER TABLE donde agregas la llave foránea que vincula LibrosEstado con Libro tiene el error de que la misma llave foránea que declaras des decir su nombre, es el mismo nombre de columna que usas para indicar la llave primaria; es decir con la llave foránea de LibrosEstado estas apuntando a la llave primaria de la misma tabla LibrosEstado cuando debería ser a la columna LibroID

SCRIPT CORREGIDO

create database libreria;
use libreria;

create table Libro(
LibroID char(8) primary key,
Titulo  varchar(30) not null,
Editorial   varchar(20) not null,
Seccion varchar(25) not null,
FechaPublicacion    date    null,
FechaEdicion    date    null,
PrecioEntrada   float(4)    not null,
PrecioSalida    float(4)    not null,
EstadoLibroID   char(8) not null,
Venido  bit(1)  not null);

create table LibrosEstado(
EstadoLibroID   char(8) primary key,
NombreEdo   varchar(15) not null,
Descripcion varchar(25)  null);

create table Autor(
AutorID char(8) primary key,
Nombre  varchar(25) null,
Apellido    varchar(25) not null,
PaisOrigen  varchar(20) null,
Nacio   int(4)  null,
Murio   int(4)  null,
Descripcion varchar(50) null);

create table AutorLibro(
AutorID char(8) primary key,
LibroID char(8) not null);

create table Cargo(
CargoID char(8) primary key,
Cargo   varchar(20) not null,
Descripcion varchar(50) null);

create table Empleado(
EmpleadoID  char(8) primary key,
Nombre  varchar(25)  null,
Apellido    varchar(25)  null,
Direccion   varchar(50)  null,
Ciudad  varchar(20)  null,
Estado  varchar(20)  null,
CP  char(5) null,
Telefono    varchar(20) null,
FechaIngreso    date     null,
CargoID char(8)  null);

create table FormaPago(
FormaPagoID char(8) primary key,
Descripcion varchar(50) null);

create table OrdenEstado(
EstadoOrdenID   char(8) primary key,
Descripcion varchar(50) null);

create table Cliente(
ClienteID   char(10)    primary key,
Nombre  varchar(25) not null,
Apellido    varchar(25) not null,
Telefono    varchar(20) null,
Direccion   varchar(50) null,
Ciudad  varchar(20) null,
Estado  varchar(20) null,
CP  char(5) not null);

create table Orden(
OrdenID char(8) primary key,
EmpleadoID  char(8) null,
ClienteID   char(8) null,
FechaOrden  date    null,
FechaEnvio  date    not null,
MontoVenta  float   null,
FormaPagoID char(8) null,
EstadoOrdenID char(8)   null);

create table OrdenLibro(
OrdenID char(8) primary key,
LibroID char(8) not null);

alter table AutorLibro add foreign key (LibroID) references Libro (LibroID);
alter table LibrosEstado add foreign key (EstadoLibroID) references Libro (LibroID);
alter table AutorLibro add foreign key (AutorID) references Autor (AutorID);
alter table OrdenLibro add foreign key (LibroID) references Libro (LibroID);
alter table OrdenLibro add foreign key (OrdenID) references Orden (OrdenID);
alter table OrdenLibro add foreign key (LibroID) references Libro (LibroID);
alter table Orden add foreign key (ClienteID) references Cliente (ClienteID);
alter table Empleado add foreign key (CargoID) references Cargo (CargoID);
alter table Orden add foreign key (EstadoOrdenID) references OrdenEstado (EstadoOrdenID);
alter table Orden add foreign key (FormaPagoID) references FormaPago (FormaPagoID);

Answered by BetaM on December 25, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP