Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Problema con tabla con claves foráneas

Estas en el tema de Problema con tabla con claves foráneas en el foro de Mysql en Foros del Web. El contexto es el siguiente, tengo en total en mi DB seis tablas, una de ellas, la última, tiene 3 claves foráneas que hacen referencia ...
  #1 (permalink)  
Antiguo 17/11/2012, 12:17
 
Fecha de Ingreso: mayo-2011
Mensajes: 26
Antigüedad: 13 años, 6 meses
Puntos: 1
Problema con tabla con claves foráneas

El contexto es el siguiente, tengo en total en mi DB seis tablas, una de ellas, la última, tiene 3 claves foráneas que hacen referencia a 3 claves de otras tablas.

El detalle de las mismas es el siguiente:

Código MySQL:
Ver original
  1. CREATE TABLE Polichile (
  2.                       rut_polichile VARCHAR(10) NOT NULL,  
  3.                       nombre_polichile VARCHAR(30) NOT NULL,
  4.                       cargo VARCHAR(30) NOT NULL,
  5.                       PRIMARY KEY(rut_polichile)
  6.  
  7. CREATE TABLE CentroEducacional (
  8.                       id_institucion INT NOT NULL,
  9.                       nombre_institucion VARCHAR(30) NOT NULL,
  10.                       PRIMARY KEY(id_institucion)
  11.  
  12. CREATE TABLE Delito (
  13.                       id_delito INT NOT NULL,
  14.               nombre_delito VARCHAR(30) NOT NULL,
  15.               nivel_gravedad INT NOT NULL,
  16.                   PRIMARY KEY(id_delito)
  17.                     ) ENGINE=InnoDB;
  18.  
  19. CREATE TABLE Alumno ( rut_alumno VARCHAR(10) NOT NULL,
  20.               nombre_alumno VARCHAR(30) NOT NULL,
  21.                       edad INT NOT NULL,
  22.                       id_institucion INT NOT NULL,
  23.                       PRIMARY KEY(rut_alumno),
  24.                       FOREIGN KEY(id_institucion) REFERENCES CentroEducacional(id_institucion) ON UPDATE CASCADE ON DELETE CASCADE
  25.                     ) ENGINE=InnoDB;
  26.  
  27. CREATE TABLE Antecedente (
  28.                        rut_alumno VARCHAR(10) NOT NULL,
  29.                id_documento INT NOT NULL,
  30.                        sentencia VARCHAR(30) NULL,
  31.                        PRIMARY KEY(rut_alumno, id_documento),                            
  32.                        FOREIGN KEY(rut_alumno) REFERENCES Alumno(rut_alumno) ON UPDATE CASCADE ON DELETE CASCADE
  33.                          ) ENGINE=InnoDB;
  34.  
  35. CREATE TABLE Antecedente_delito (
  36.                         id_delito INT NOT NULL,
  37.                     id_documento INT NOT NULL,
  38.                         fecha DATE NOT NULL,
  39.                         rut_polichile VARCHAR(10) NOT NULL,
  40.                         PRIMARY KEY(id_delito, id_documento, fecha),
  41.                         INDEX(id_delito),
  42.                         FOREIGN KEY(id_delito) REFERENCES Delito(id_delito) ON UPDATE CASCADE ON DELETE CASCADE,
  43.                         INDEX(id_documento),
  44.                         FOREIGN KEY(id_documento) REFERENCES Antecedente(id_documento) ON UPDATE CASCADE ON DELETE CASCADE,
  45.                         INDEX(rut_polichile),
  46.                         FOREIGN KEY(rut_polichile) REFERENCES Polichile(rut_polichile) ON UPDATE CASCADE ON DELETE CASCADE
  47.                       ) ENGINE=InnoDB;

En la última tabla anteriormente mencionada, antecedentes_delito, puedo sin problemas declarar las claves id_delito y rut_polichile como claves foráneas que hacen referencias a las claves del mismo nombre de sus respectivas tablas. Sin embargo, mi problema se da en que no puedo declarar la clave id_documento como clave foránea, y de acuerdo a la información que se me proporciona vía el comando SHOW ENGINE INNODB STATUS, aparentemente la estoy declarando mal.

Código MySQL:
Ver original
  1. INDEX(id_documento),
  2. FOREIGN KEY(id_documento) REFERENCES Antecedente(id_documento) ON UPDATE CASCADE ON DELETE CASCADE

La tabla donde está la clave a la cual se le hace referencia
Código MySQL:
Ver original
  1. CREATE TABLE Antecedente (
  2.                        rut_alumno VARCHAR(10) NOT NULL,
  3.                id_documento INT NOT NULL,
  4.                        sentencia VARCHAR(30) NULL,
  5.                        PRIMARY KEY(rut_alumno, id_documento),                            
  6.                        FOREIGN KEY(rut_alumno) REFERENCES Alumno(rut_alumno) ON UPDATE CASCADE ON DELETE CASCADE
  7.                          ) ENGINE=InnoDB;

Todo el resto de las tablas se puede declarar sin problemas.

¿Alguna sugerencia?

Saludos!
  #2 (permalink)  
Antiguo 17/11/2012, 12:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con tabla con claves foráneas

Cita:
Sin embargo, mi problema se da en que no puedo declarar la clave id_documento como clave foránea, y de acuerdo a la información que se me proporciona vía el comando SHOW ENGINE INNODB STATUS, aparentemente la estoy declarando mal.
El problema es sencillo.
Tu PK en "Antecedente" es
Código MySQL:
Ver original
  1. PRIMARY KEY(rut_alumno, id_documento)
y quieres crear una FK referida a ella que es:
Código MySQL:
Ver original
  1. FOREIGN KEY(id_documento)
  2. REFERENCES Antecedente(id_documento)
¿Notas la diferencia?
La tabla origen tiene una PK creada sobre dos campos, pero la FK que quieres apuntarle tiene un sólo campo. Por ende te estás olvidando de la esencia de la definición de FK:
"Campo o conjunto de campos cuyo valor se referencia a la PK de otra tabla."
Es decir, si una PK tiene más de un campo, la FK que se referencie a ella tiene que tener la misma cantidad de campos, en el mismo orden y del mismo tipo.
Y eso no lo estás haciendo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 17/11/2012, 12:37
 
Fecha de Ingreso: mayo-2011
Mensajes: 26
Antigüedad: 13 años, 6 meses
Puntos: 1
Respuesta: Problema con tabla con claves foráneas

Me quedó clarísima donde estaba la falla, en un rato más lo implemento y lo pongo para mostrar como me quedó. Gracias =D

Edit: Así me quedó finalmente:
Código MySQL:
Ver original
  1. CREATE TABLE Antecedente_delito (
  2.                                   rut_alumno VARCHAR(10) NOT NULL,
  3.                   id_delito INT NOT NULL,
  4.                   id_documento INT NOT NULL,
  5.                                   fecha DATE NOT NULL,
  6.                                   rut_polichile VARCHAR(10) NOT NULL,
  7.                                   PRIMARY KEY(id_delito, id_documento, fecha),
  8.                                   INDEX(id_delito),
  9.                                   FOREIGN KEY(id_delito) REFERENCES Delito(id_delito) ON UPDATE CASCADE ON DELETE CASCADE,
  10.                   INDEX(rut_alumno, id_documento),
  11.                                   FOREIGN KEY(rut_alumno, id_documento) REFERENCES Antecedente(rut_alumno, id_documento) ON UPDATE CASCADE ON DELETE CASCADE,
  12.                                   INDEX(rut_polichile),
  13.                                   FOREIGN KEY(rut_polichile) REFERENCES Polichile(rut_polichile) ON UPDATE CASCADE ON DELETE CASCADE
  14.                                 ) ENGINE=InnoDB;
Saludos!

Última edición por Amphoth3ra; 18/11/2012 a las 11:55 Razón: Solución del problema

Etiquetas: claves, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:34.