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

Llaves foraneas para agregar datos a una tabla

Estas en el tema de Llaves foraneas para agregar datos a una tabla en el foro de Mysql en Foros del Web. Hola, necesito ayuda con la creación de unas tablas y sus respectivas llaves foraneas en MySQL. Tengo la tabla Evaluador y Seccion. Seccion forma parte ...
  #1 (permalink)  
Antiguo 15/11/2012, 12:37
 
Fecha de Ingreso: septiembre-2012
Mensajes: 26
Antigüedad: 12 años, 1 mes
Puntos: 2
Llaves foraneas para agregar datos a una tabla

Hola, necesito ayuda con la creación de unas tablas y sus respectivas llaves foraneas en MySQL.

Tengo la tabla Evaluador y Seccion.

Seccion forma parte de un examen completo que es revisado por varios Evaluadores por lo tanto un Evaluador solo puede evaluar 1 seccion y 1 seccion solo puede ser evaluada por 1 profesor.

Al momento de ingresar mediante un formulario los datos de las secciones se coloca el Nombre y el Id del Evaluador que la va a calificar asi que para crear la tabla lo hice asi:


Código MySQL:
Ver original
  1. CREATE  TABLE IF NOT EXISTS Secciones (
  2. `IdSeccion` INT NOT NULL AUTO_INCREMENT ,
  3. `Nombre` VARCHAR(45) NOT NULL ,
  4. `IdEvaluador` INT NOT NULL ,
  5. PRIMARY KEY (`IdSeccion`) ,
  6. CONSTRAINT `IdEvaluador`
  7. FOREIGN KEY (`IdEvaluador` )
  8. REFERENCES `mydb`.`Evaluadores` (`IdEvaluador` )


Para ingresar en otro formulario los datos del Evaluador se coloca el Nombre, y por medio de una lista desplegable y una consulta SQL le muestro el Nombre de la tabla Seccion para almacenar el Id de la Seccion aqui:


Código MySQL:
Ver original
  1. CREATE  TABLE IF NOT EXISTS Evaluadores (
  2. `IdEvaluador` INT NOT NULL AUTO_INCREMENT ,
  3. `Nombre` VARCHAR(45) NOT NULL ,
  4. `IdSeccion` INT NOT NULL ,
  5. PRIMARY KEY (`IdEvaluador`) ,
  6. CONSTRAINT `IdSeccion`
  7. FOREIGN KEY (`IdSeccion` )
  8. REFERENCES `mydb`.`Secciones` (`IdSeccion` )


Por lo tanto, primero estoy llenando la tabla Seccion para que asi al momento de agregar Evaluadores pues la lista desplegable tenga un contenido, el problema es que a la hora de agregar un Evaluador desde el formulario ingresando el Nombre y eligiendo la seccion de la lista desplegable me dice:


Cannot add or update a child row: a foreign key constraint fails (`mydb`.`evaluadores`, CONSTRAINT `evaluadores_ibfk_1` FOREIGN KEY (`IdSeccion`)
REFERENCES `secciones` (`IdSeccion`) ON DELETE CASCADE ON UPDATE CASCADE)



Creo que eso me indica que establecí mal alguna relacion pero
no se cual, o quizá me faltó establecer otra con los otros campos no se, espero
se haya entendido, gracias

Última edición por gnzsoloyo; 15/11/2012 a las 12:39 Razón: SQL sin etiquetar.
  #2 (permalink)  
Antiguo 15/11/2012, 12:48
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: Llaves foraneas para agregar datos a una tabla



Lo siento, pero es un error común en el aprendizaje...


Has creado lo que se denomina "dependencia circular", lo que representa uno de los peores errores que se pueden cometer.

Explico: Una dependencia circular se produce cuando relacionas dos tablas entre si haciendolas interdepender. Esto hace que sea imposible ingresar un registro en la tabla A, si no existe previamente el registro en la B a causa de una FK. Pero tampoco puedes insertar un registro en la B porque posee una FK que depende de la A....
Esa relación jamás se debe construir, porque es imposible de cumplir.

Tu error está en realidad a nivel de definición del sistema: Una relación 1:1 como la que propones requiere que una única FK esté en una única tabla. No requiere que existan en ambas porque la unicidad se crea al declara UNIQUE ese campo.
¿En donde va la FK?
Es una decisión de diseño. Puede ir en cualquiera de las dos tablas, pero no en las dos. Lo que se hace normalmente es ver cuál sería la dependencia "natural" de las entidades.
En tu caso, una Sección siempre es evaluada por un único Evaluador, pero el Evaluador se puede inferir como variable (entre uno y otro examen podría ser reasignado), mientras que la sección siempre existe. Eso podría decir definir que la FK vaya en Sección, y no en Evaluador.

En realidad, el sistema no puede tener dos únicas tablas, porque un Evaluador no evalúa una sección sino el examen tomado a una sección en un momento determinado del tiempo. Por ende, el sistema en realidad requiere un diseño mayor, con entidades mejor definidas.
Pero no sé si eso es lo que tienes que hacer.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 15/11/2012 a las 12:55
  #3 (permalink)  
Antiguo 15/11/2012, 15:25
 
Fecha de Ingreso: septiembre-2012
Mensajes: 26
Antigüedad: 12 años, 1 mes
Puntos: 2
Respuesta: Llaves foraneas para agregar datos a una tabla

Algo había leído al respecto pero me lo has dejado más claro, sobre todo por
que lo usaré para otras tablas, ya que como mencionas, el sistema tiene mas
entidades y un diseño mas extenso pero mejor ir aclarando este tipo de
dudas basicas de una vez.

Me fije que desde el PHPMyAdmin añadí correctamente las FK por que para insertar datos desde dicho gestor si lo hace correctamente ya. El problema ya solo me aparece en mi interfaz que cree con PHP, supongo que eso ya es cosa del programa que estoy diseñando
  #4 (permalink)  
Antiguo 15/11/2012, 17:09
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: Llaves foraneas para agregar datos a una tabla

El hecho que puedas crear las relaciones, no implica que las relaciones estén correctamente diseñadas. Es una etapa completamente distinta y no debes jamás confundir la base de datos con la aplicación.
Diseña bien la base, y luego tendrás menos problemas al crear las consultas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: llave, relacion, sql, foreignkey
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 12:40.