Foros del Web » Programando para Internet » PHP »

problemas con FOREIGN KEY

Estas en el tema de problemas con FOREIGN KEY en el foro de PHP en Foros del Web. hola amigos tengo un problema con un FOREIGN KEY que no lo coge. tengo una tabla llamada avisos y tres FOREIGN KEY apuntando hacia otras ...
  #1 (permalink)  
Antiguo 06/06/2015, 15:45
 
Fecha de Ingreso: mayo-2003
Mensajes: 194
Antigüedad: 21 años
Puntos: 4
problemas con FOREIGN KEY

hola amigos tengo un problema con un FOREIGN KEY que no lo coge.

tengo una tabla llamada avisos y tres FOREIGN KEY apuntando hacia otras tablas, los dos primeros los coge bien pero el de codigo_imagen no lo coge y lo tengo puesto como los otros dos anteriores.

FOREIGN KEY (`codigo_tec` )
REFERENCES `rtp`.`tecnicos` (`codigo_tec` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_avi_cod_cli`
FOREIGN KEY (`codigo_cli` )
REFERENCES `rtp`.`clientes` (`codigo_cli` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `img`
FOREIGN KEY (`codigo_imagen` )
REFERENCES `rtp`.`imagenes` (`codigo_imagen` )
ON DELETE CASCADE
ON UPDATE CASCADE)


aqui os pongo la tabla completa a ver si me podeis ayudar:

-- Table `rtp`.`avisos`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `rtp`.`avisos` (
`codigo_avi` INT NOT NULL AUTO_INCREMENT ,
`fecha_avi` DATE NOT NULL ,
`hora_avi` TIME NULL ,
`codigo_cli` INT NOT NULL ,
`servicio` VARCHAR(300) NULL ,
`urgente` VARCHAR(45) NULL ,
`reparacion` VARCHAR(300) NULL ,
`fecha_cita` DATE NULL ,
`hora_cita` TIME NULL ,
`importe_factura` INT NULL ,
`mano_de_obra` INT NULL ,
`materiales` INT NULL ,
`precios_tecnico` INT NULL ,
`precio_2` INT NULL ,
`precio_3` INT NULL ,
`codigo_tec` INT NOT NULL ,
`atencion_recibida` VARCHAR(45) NULL ,
`satisfaccion_precio` VARCHAR(45) NULL ,
`observaciones` VARCHAR(300) NULL ,
`finalizado` VARCHAR(45) NULL ,
`codigo_imagen` INT NOT NULL ,
PRIMARY KEY (`codigo_avi`) ,
INDEX `fk_avi_cod_tec_idx` (`codigo_tec` ASC) ,
INDEX `img_idx` (`codigo_imagen` ASC) ,
INDEX `fk_avi_cod_cli_idx` (`codigo_cli` ASC) ,
CONSTRAINT `fk_avi_cod_tec`
FOREIGN KEY (`codigo_tec` )
REFERENCES `rtp`.`tecnicos` (`codigo_tec` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_avi_cod_cli`
FOREIGN KEY (`codigo_cli` )
REFERENCES `rtp`.`clientes` (`codigo_cli` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `img`
FOREIGN KEY (`codigo_imagen` )
REFERENCES `rtp`.`imagenes` (`codigo_imagen` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;


y esta es la tabla donde tengo el primary key de codigo_imagen:

-- Table `rtp`.`imagenes`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `rtp`.`imagenes` (
`ruta` VARCHAR(100) NULL ,
`codigo_avi` INT(20) NOT NULL ,
`codigo_imagen` INT NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`codigo_imagen`) ,
INDEX `fk_img_cod_avi_idx` (`codigo_avi` ASC) ,
CONSTRAINT `fk_img_cod_avi`
FOREIGN KEY (`codigo_avi` )
REFERENCES `rtp`.`avisos` (`codigo_avi` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


muchas gracias por vuestra ayuda.
  #2 (permalink)  
Antiguo 06/06/2015, 17:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: problemas con FOREIGN KEY

Estas creando una relación circular, lo que es un error de los muy graves, porque es una restricción de cumplimiento imposible.
Avisos tiene una FK que apunta a Imágenes, pero Imágenes tiene una FK que apunta a Avisos...
Eso es imposible, porque la PK de imágenes debe existir así antes de que se inserte el aviso, pero el aviso no se puede insertar si no existe previamente la PK de imágenes...

¿Se entiende?

Ese tipo de dependencias es un error de diseño. Está MAL.
__________________
¿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 06/06/2015, 17:59
 
Fecha de Ingreso: mayo-2003
Mensajes: 194
Antigüedad: 21 años
Puntos: 4
Respuesta: problemas con FOREIGN KEY

si lo entiendo amigo gracias, la cuestion es que creo que hace unos dias lo tenia puesto asi, y funcionaba.

¿entonces como hago si tengo que recoger el foreing key en avisos desde imagenes?¿n0o hay alguna manera?

cuando se crea el aviso se crea al mismo tiempo la primary key de imagenes, es el mismo formulario.

un saludo y muchas gracias por tu ayuda.
  #4 (permalink)  
Antiguo 06/06/2015, 19:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: problemas con FOREIGN KEY

La regla es simple: las imágenes dependen del aviso, o los avisos dependen de las imágenes.
Eso define dónde va que FK.

Y si una imagen puede ir en diferentes avisos, la relación es N:M y te Está faltando una tabla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 07/06/2015, 04:19
 
Fecha de Ingreso: mayo-2003
Mensajes: 194
Antigüedad: 21 años
Puntos: 4
Respuesta: problemas con FOREIGN KEY

gracias por la respuesta.

la imagen solo aparece en un aviso, asi que estoy viendo de poner un campo en avisos que sea imagen asi elimino la tabla imagenes, y la otra manera seria quitar el foreing key de imagenes que no me vale para nada y asi ya no tendria problemas. eso es lo que voy a hacer. muchas gracias. es que no sabia que no se podia poner una foreing key hacia una tabla y otro foreing key apuntando hacia la otra tabla.

hice mil pruebas de ponerle not nuill, etc... y no funcionaba.

ya se me queda claro.

gracias por vuestra ayuda.

Última edición por vegas; 07/06/2015 a las 04:39
  #6 (permalink)  
Antiguo 07/06/2015, 09:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: problemas con FOREIGN KEY

Cuando creas una relacion circular como la que mencioné, es usual que no se manifiesten problemas al crear las tablas, porque no hay registros y tampoco valores que haya que cumplir. El problema aparece al insertar el primer registro...
Debes tener en cuenta que las restricciones de FK son restricciones de cumplimiento obligatorio que la base de datos evalúa siempre ANTES de dejar que el registro se incorpore a la tabla.
Por otro lado, ten muy en cuenta también que agregar una restricción de FK a una tabla que ya contiene datos hará que el BDMS antes de crear la FK , verifique que TODOS los datos de ambas tablas cumplan con la restricción, y si en cuentra al menos UNO que no lo hace, la creación de la FK dará error.
__________________
¿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: fecha, key, 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 08:46.