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

Error en INSERT con innodb

Estas en el tema de Error en INSERT con innodb en el foro de Mysql en Foros del Web. Hola, tengo un problema en un insert que no se solucionar. Tengo 2 innodb tablas: CREATE TABLE IF NOT EXISTS `comp-name` ( `CompId` int(11) NOT ...
  #1 (permalink)  
Antiguo 03/03/2008, 13:13
 
Fecha de Ingreso: octubre-2004
Ubicación: En algún lugar de la República Oriental del Uruguay
Mensajes: 366
Antigüedad: 19 años, 6 meses
Puntos: 0
Error en INSERT con innodb

Hola, tengo un problema en un insert que no se solucionar. Tengo 2 innodb tablas:


CREATE TABLE IF NOT EXISTS `comp-name` (
`CompId` int(11) NOT NULL auto_increment,
`CompName` varchar(255) default NULL,
PRIMARY KEY (`CompId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE IF NOT EXISTS `comp-dep-access` (
`CompId` int(11) NOT NULL default '0',
`DepId` int(11) NOT NULL default '0',
PRIMARY KEY (`CompId`,`DepId`),
KEY `depid` (`DepId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



ALTER TABLE `comp-name`
ADD CONSTRAINT `compid_key` FOREIGN KEY (`CompId`) REFERENCES `comp-dep-access` (`CompId`);

ALTER TABLE `comp-dep-access`
ADD CONSTRAINT `depid` FOREIGN KEY (`DepId`) REFERENCES `comp-department` (`DepId`);


Cuando intento insertar en comp-name

1452 - Cannot add or update a child row: a foreign key constraint fails (`operationware/comp-name`, CONSTRAINT `compid_key` FOREIGN KEY (`CompId`) REFERENCES `comp-dep-access` (`CompId`))



No tengo mucha experiencia con innodb, alguien me podría decir cual es el error?

Gracias
__________________
ratamaster
  #2 (permalink)  
Antiguo 04/03/2008, 05:21
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
Re: Error en INSERT con innodb

Generaste una dependencia cruzada, es decir la tabla comp-name depende de la tabla comp-name-access y la comp-name-access de comp-name.

Esto es un error conceptual, que es programación se denomina "abrazo mortal" (deadlock). Como cada una depende de la otra, ninguna puede actualizarse porque cada tabla en que intentes ingresar datos verifica contra la otra, como en la otra el valor no existe y rechaza el ingreso, así ad aeternum.

El tema es que una de las tablas debe ser la primaria, de la que dependan las demás. habitualmente sn las tablas en las que sus datos no dependan de datos externos, o que si los hay no son mandatorios.

Por ejemplo: Una tabla Clientes podría tener un campo que establezca que cuenta con teléfonos (muchos), ese campo bien podría ser un enter, 0 o NULL indicaría sin teléfono, otro número sería el ID del registro de todos los teléfonos en una tabla TelefonosClientes(ID,NroTel) ID se repite pero la clave es con ambos campos a la vez, por lo que jamás se repite.

NUNCA hagas este tipo de relaciones cruzadas.
La solución: Quitale la contraint a la tabla comp-name, no la necesita.
  #3 (permalink)  
Antiguo 04/03/2008, 08:04
 
Fecha de Ingreso: octubre-2004
Ubicación: En algún lugar de la República Oriental del Uruguay
Mensajes: 366
Antigüedad: 19 años, 6 meses
Puntos: 0
Re: Error en INSERT con innodb

Muchas gracias por tu respuesta tan pero tan clara!
Sabes que me di cuenta de esto al ponerme a estudiar un tutorial sobre la relación padre-hija, pero cuando escibí ese pregunta no tenía tiempo para estudiar nada...
Hice lo que me dijiste y funcionó bien, así que gracias por tu ayuda y la cultura vertida :)
__________________
ratamaster
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:15.