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

Cannot add or update a child row

Estas en el tema de Cannot add or update a child row en el foro de Mysql en Foros del Web. Hola a todos. Primero que nada pues espero que se encuentren muy bien. Y que me puedan ayudar con este super error!!!! Cannot add or ...
  #1 (permalink)  
Antiguo 25/06/2009, 22:54
 
Fecha de Ingreso: junio-2009
Mensajes: 23
Antigüedad: 15 años, 5 meses
Puntos: 1
Cannot add or update a child row

Hola a todos.
Primero que nada pues espero que se encuentren muy bien.
Y que me puedan ayudar con este super error!!!!

Cannot add or update a child row: a foreign key constraint fails (`american/pedido`, CONSTRAINT `pedido_ibfk_1` FOREIGN KEY (`ordenproduccion_idordenproduccion`, `ordenproduccion_clientes_idcliente`) REFERENCES `ordenproduccion` (`idordenproduccion`, `client)
AL INTENTAR INSERTAR DATOS DESDE EL MISMO MySQL Query

El código de la base de datos es este:

CREATE TABLE clientes (
idcliente INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nombre VARCHAR(45) NULL,
telefono INT NULL,
compania VARCHAR(45) NULL,
PRIMARY KEY(idcliente)
);

CREATE TABLE ordenproduccion (
idordenproduccion INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
clientes_idcliente INTEGER UNSIGNED NOT NULL,
modelo VARCHAR(10) NULL,
cantidad INTEGER UNSIGNED NULL,
talla VARCHAR(5) NULL,
color VARCHAR(10)) NULL,
descripcion VARCHAR(15) NULL,
precio DOUBLE NULL,
observaciones VARCHAR(100) NULL,
nopedido INTEGER UNSIGNED NULL,
PRIMARY KEY(idordenproduccion, clientes_idcliente),
FOREIGN KEY(clientes_idcliente)
REFERENCES clientes(idcliente)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);

CREATE TABLE pedido (
idpedido INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
ordenproduccion_clientes_idcliente INTEGER UNSIGNED NOT NULL,
ordenproduccion_idordenproduccion INTEGER UNSIGNED NOT NULL,
fechapedido DATE NULL,
fechaentrega DATE NULL,
nonota INTEGER UNSIGNED NULL,
vendedor VARCHAR(10) NULL,
PRIMARY KEY(idpedido, ordenproduccion_clientes_idcliente, ordenproduccion_idordenproduccion),
FOREIGN KEY(ordenproduccion_idordenproduccion, ordenproduccion_clientes_idcliente)
REFERENCES ordenproduccion(idordenproduccion, clientes_idcliente)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);

CREATE TABLE pagos (
idpago INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
pedido_idpedido INTEGER UNSIGNED NOT NULL,
pedido_ordenproduccion_clientes_idcliente INTEGER UNSIGNED NOT NULL,
pedido_ordenproduccion_idordenproduccion INTEGER UNSIGNED NOT NULL,
noprendas INTEGER UNSIGNED NULL,
totapagar DOUBLE NULL,
formapago VARCHAR(20) NULL,
pagado DOUBLE NULL,
restante DOUBLE NULL,
fecha DATE NULL,
PRIMARY KEY(idpago, pedido_idpedido),
FOREIGN KEY(pedido_idpedido, pedido_ordenproduccion_clientes_idcliente, pedido_ordenproduccion_idordenproduccion)
REFERENCES pedido(idpedido, ordenproduccion_clientes_idcliente, ordenproduccion_idordenproduccion)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
  #2 (permalink)  
Antiguo 26/06/2009, 06:34
Avatar de cala932  
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 18 años, 2 meses
Puntos: 9
Respuesta: Cannot add or update a child row

Hola, eso es un error de integridad, es decir estas intentando ingresar u actualizar un registro en la tabla pedido, donde estas colocando mal alguna de las claves foraneas que se encuentran en esa tabla. Revisa bien los datos de entrada.

Saludos
__________________
->Aprender es un proceso que incluye el error..
  #3 (permalink)  
Antiguo 26/06/2009, 06: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: Cannot add or update a child row

Cuando insertas un registro en una tabla que contenga FK, debes asegurarte previamente que el valor que intentas poner en el campo FK ya existe en la tabla a que hacer referencia.
Debes recordar que cuando declaras un campo como FK:
1. No puedes dejarlo NULL, el INSERT tiene que poner en valor allí si o si.
2. Una FK no inserta datos en una tabla referida, solamente comprueba que el valor exista en esa tabla. La tabla referida debe llenarse primero.

Por otro lado, en la definición de las tablas estás complicando innecesariamente las FK y los nombres de los campos. Hay una forma más simple de construirlas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 26/06/2009, 23:07
 
Fecha de Ingreso: junio-2009
Mensajes: 23
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Cannot add or update a child row

muchas gracias por sus comentarios, los datos que introduzco son del tipo, las tablas con las que coexisten relaciones estan llenas ya, verificaré que los datos de verdad existan y comentare como me va, ademas que intentaré ver como simplificar las tablas aunque como soy un principiante me auxilie de dbdesigner para crear las relaciones, trabajo sobre sus comentarios muchas gracias.
  #5 (permalink)  
Antiguo 27/06/2009, 09:04
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: Cannot add or update a child row

Estás perdiendo un detalle: No es un problema e simplicidad de tablas. Es un problema de integridad de datos entrantes.
Esto significa que no importa si la tabla es más o menos compleja: si sigues entrando datos con las PK duplicadas o con las FK faltantes o incorrectas, el error seguirá produciéndose.
Esto puede producirse por ingresar los datos en una secuencia incorrecta o bien por faltar alguno de ellos.
Pero existe otro punto a analizar:
En el modelo de tablas que propones yo encuentro un problema que se puede producir en el transcurso de la implementación: Has puesto tanta complejidad en la definición de las PK que eventualmente puede haber un problema en las inserciones.
Por un lado tienes que recordar que todas las tablas que propones tienen una cardinalidad 1:1, lo que significa que cada registro de una tabla se relaciona con un único registro de la la otra, si solamente tenemos en cuenta la cadena de relaciones que has planteado cliente -> ordendeproduccion -> pedidos -> pagos. Esto implica que para mantener la integridad de datos solamente hace falta que la siguiente tabla contenga la PK de la anterior. El error conceptual es que, habiendo puesto un campo AUTO_INCREMENT, es absolutamente innecesario crear una PK en la segunda tabla con ambas claves.
Cabe aquí la nota: Una PK es un campo que identifica unívocamente un registro en una tabla. Un campo autoincremental es por definición único, por lo que la clave no requiere de ningún oro campo adicional.
Dicho así, entenderás que estás sobrecargando sin necesidad la PK de las siguientes tablas. La PK de la primera es su ID, el de la segunda el suyo , el de la tercera también, y el de la cuarta igual. No requieren de otro campo.
Ahora bien, a partir de la segunda tabla, lo que pueden requerir (no necesariamente, pero si por simplicidad de consultas), es agregar como FK los identificadores de todas las tablas precedentes. Pero estas FK no deben formar parte de la PK. Pueden, si, conformar claves de índices, pero ese es otro asunto.
Entonces, un modelo funcional y con pocos problemas de inserción sería:
Código sql:
Ver original
  1. CREATE TABLE clientes (
  2. idcliente INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  3. nombre VARCHAR(45) NULL,
  4. telefono INT NULL,
  5. compania VARCHAR(45) NULL,
  6. PRIMARY KEY(idcliente)
  7. );
  8.  
  9. CREATE TABLE ordenproduccion (
  10. idordenproduccion INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  11. idcliente INTEGER UNSIGNED NOT NULL,
  12. modelo VARCHAR(10) NULL,
  13. cantidad INTEGER UNSIGNED NULL,
  14. talla VARCHAR(5) NULL,
  15. color VARCHAR(10) NULL,
  16. descripcion VARCHAR(15) NULL,
  17. precio DOUBLE NULL,
  18. observaciones VARCHAR(100) NULL,
  19. nopedido INTEGER UNSIGNED NULL,
  20. PRIMARY KEY(idordenproduccion),
  21. FOREIGN KEY(idcliente)
  22. REFERENCES clientes(idcliente)
  23. ON DELETE NO ACTION
  24. ON UPDATE NO ACTION
  25. );
  26.  
  27. CREATE TABLE pedido (
  28. idpedido INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  29. idcliente INTEGER UNSIGNED NOT NULL,
  30. idordenproduccion INTEGER UNSIGNED NOT NULL,
  31. fechapedido DATE NULL,
  32. fechaentrega DATE NULL,
  33. nonota INTEGER UNSIGNED NULL,
  34. vendedor VARCHAR(10) NULL,
  35. PRIMARY KEY(idpedido),
  36. FOREIGN KEY(idordenproduccion)
  37. REFERENCES ordenproduccion(idordenproduccion)
  38. ON DELETE NO ACTION
  39. ON UPDATE NO ACTION,
  40. FOREIGN KEY(idcliente)
  41. REFERENCES clientes(idcliente)
  42. ON DELETE NO ACTION
  43. ON UPDATE NO ACTION
  44. );
  45.  
  46. CREATE TABLE pagos (
  47. idpago INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  48. idpedido INTEGER UNSIGNED NOT NULL,
  49. idcliente INTEGER UNSIGNED NOT NULL,
  50. idordenproduccion INTEGER UNSIGNED NOT NULL,
  51. noprendas INTEGER UNSIGNED NULL,
  52. totapagar DOUBLE NULL,
  53. formapago VARCHAR(20) NULL,
  54. pagado DOUBLE NULL,
  55. restante DOUBLE NULL,
  56. fecha DATE NULL,
  57. PRIMARY KEY(idpago),
  58. FOREIGN KEY(idordenproduccion)
  59. REFERENCES ordenproduccion(idordenproduccion)
  60. ON DELETE NO ACTION
  61. ON UPDATE NO ACTION,
  62. FOREIGN KEY(idcliente)
  63. REFERENCES clientes(idcliente)
  64. ON DELETE NO ACTION
  65. ON UPDATE NO ACTION,
  66. FOREIGN KEY(idpedido)
  67. REFERENCES pedido(idpedido)
  68. ON DELETE NO ACTION
  69. ON UPDATE NO ACTION
  70. );
Esto, si lo pruebas, verás que puede crearse sin ningún inconveniente, y no exigirá los procesos de integridad como lo hace el mdoelo anterior.

Prueba y veamos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 17:45.