Ver Mensaje Individual
  #5 (permalink)  
Antiguo 27/06/2009, 09:04
Avatar de gnzsoloyo
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)