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

FATAL ERROR: Integrity constraint violation: 1452 Cannot add or update a child row

Estas en el tema de FATAL ERROR: Integrity constraint violation: 1452 Cannot add or update a child row en el foro de Mysql en Foros del Web. Hola, sucede que estoy realizando mi primer proyecto tratando de crear un pequeño sistema que ayude a los doctores a gestionar sus pacientes. bueno, uno ...
  #1 (permalink)  
Antiguo 14/07/2015, 16:58
 
Fecha de Ingreso: julio-2014
Mensajes: 8
Antigüedad: 9 años, 8 meses
Puntos: 0
Pregunta FATAL ERROR: Integrity constraint violation: 1452 Cannot add or update a child row

Hola, sucede que estoy realizando mi primer proyecto tratando de crear un pequeño sistema que ayude a los doctores a gestionar sus pacientes. bueno, uno de los tantos problemas que presenta el proyecto es el siguiente:

Cita:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`consultas`.`registroConsulta`, CONSTRAINT `fk_registroConsulta_fichaRegistro1` FOREIGN KEY (`fichaRegistro_idfichaRegistro`) REFERENCES `fichaRegistro` (`idfichaRegistro`) ON DELETE NO ACTION)' in /opt/lampp/htdocs/www/consultas/sistema/procesar_rc.php:27 Stack trace: #0 /opt/lampp/htdocs/www/consultas/sistema/procesar_rc.php(27): PDOStatement->execute(Array) #1 {main} thrown in /opt/lampp/htdocs/www/consultas/sistema/procesar_rc.php on line 27
lo que trato de hacer es, ingresar los datos de una consulta en un formulario, y esos datos deberán asociarse a al paciente en turno y guardarse en la bd como un "historial de consultas"

estuve googleando el error 1452 en stackoverflow y otros sitios para ver cual era el problema, si no mal entendí, se debe a que el foreing key debe de estar configurado ON CASCADE; ya que es mi primer diseño de bd quisiera descartar futuros errores en el diseño de la bd, por eso es que me gustaría que me apoyaran 1. con el error que manda mysql y 2. revisando mi diseño que realice en mysql workbench por si esta mal hecho



CODIGO SQL:

Código MySQL:
Ver original
  1. -- MySQL Workbench Forward Engineering
  2.  
  3. SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
  4. SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
  5. SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
  6.  
  7. -- -----------------------------------------------------
  8. -- Schema consultas
  9. -- -----------------------------------------------------
  10.  
  11. -- -----------------------------------------------------
  12. -- Schema consultas
  13. -- -----------------------------------------------------
  14. CREATE SCHEMA IF NOT EXISTS `consultas` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
  15. USE `consultas` ;
  16.  
  17. -- -----------------------------------------------------
  18. -- Table `consultas`.`login`
  19. -- -----------------------------------------------------
  20. CREATE TABLE IF NOT EXISTS `consultas`.`login` (
  21.   `idlogin` INT NOT NULL AUTO_INCREMENT,
  22.   `usernameLog` VARCHAR(15) NOT NULL,
  23.   `passLog` VARCHAR(25) NOT NULL,
  24.   `registroLog` DATETIME NOT NULL,
  25.   PRIMARY KEY (`idlogin`))
  26. DEFAULT CHARACTER SET = utf8
  27. COLLATE = utf8_general_ci;
  28.  
  29.  
  30. -- -----------------------------------------------------
  31. -- Table `consultas`.`fichaRegistro`
  32. -- -----------------------------------------------------
  33. CREATE TABLE IF NOT EXISTS `consultas`.`fichaRegistro` (
  34.   `idfichaRegistro` INT NOT NULL AUTO_INCREMENT,
  35.   `primNombre` VARCHAR(25) NULL,
  36.   `secNombre` VARCHAR(25) NULL,
  37.   `fichaRegistrocol` VARCHAR(25) NULL,
  38.   `apellidoP` VARCHAR(25) NULL,
  39.   `apellidoM` VARCHAR(25) NULL,
  40.   `telCasa` INT(12) NULL,
  41.   `telCel` INT(12) NULL,
  42.   `otroTel` INT(12) NULL,
  43.   `direccion` VARCHAR(50) NULL,
  44.   `edoCivil` VARCHAR(15) NULL,
  45.   `email` VARCHAR(25) NULL,
  46.   `tipoSanguineo` VARCHAR(45) NULL,
  47.   `alergias` VARCHAR(25) NULL,
  48.   `fechaNac` DATE NULL,
  49.   `ciudad` VARCHAR(32) NULL,
  50.   `ocupacion` VARCHAR(25) NULL,
  51.   `recomienda` VARCHAR(25) NULL,
  52.   PRIMARY KEY (`idfichaRegistro`))
  53. DEFAULT CHARACTER SET = utf8
  54. COLLATE = utf8_general_ci;
  55.  
  56.  
  57. -- -----------------------------------------------------
  58. -- Table `consultas`.`registroConsulta`
  59. -- -----------------------------------------------------
  60. CREATE TABLE IF NOT EXISTS `consultas`.`registroConsulta` (
  61.   `idregistroConsulta` INT NOT NULL AUTO_INCREMENT,
  62.   `motivoConsulta` TINYTEXT NULL,
  63.   `tratamiento` MEDIUMTEXT NULL,
  64.   `imgdiagnostico` MEDIUMTEXT NULL,
  65.   `labs` MEDIUMTEXT NULL,
  66.   `observaciones` MEDIUMTEXT NULL,
  67.   `fichaRegistro_idfichaRegistro` INT NOT NULL,
  68.   PRIMARY KEY (`idregistroConsulta`, `fichaRegistro_idfichaRegistro`),
  69.   INDEX `fk_registroConsulta_fichaRegistro1_idx` (`fichaRegistro_idfichaRegistro` ASC),
  70.   CONSTRAINT `fk_registroConsulta_fichaRegistro1`
  71.     FOREIGN KEY (`fichaRegistro_idfichaRegistro`)
  72.     REFERENCES `consultas`.`fichaRegistro` (`idfichaRegistro`)
  73. DEFAULT CHARACTER SET = utf8
  74. COLLATE = utf8_general_ci;
  75.  
  76.  
  77. -- -----------------------------------------------------
  78. -- Table `consultas`.`receta`
  79. -- -----------------------------------------------------
  80. CREATE TABLE IF NOT EXISTS `consultas`.`receta` (
  81.   `idreceta` INT NOT NULL AUTO_INCREMENT,
  82.   `contReceta` MEDIUMTEXT NULL,
  83.   `registroConsulta_idregistroConsulta` INT NOT NULL,
  84.   `registroConsulta_fichaRegistro_idfichaRegistro` INT NOT NULL,
  85.   PRIMARY KEY (`idreceta`, `registroConsulta_idregistroConsulta`, `registroConsulta_fichaRegistro_idfichaRegistro`),
  86.   INDEX `fk_receta_registroConsulta1_idx` (`registroConsulta_idregistroConsulta` ASC, `registroConsulta_fichaRegistro_idfichaRegistro` ASC),
  87.   CONSTRAINT `fk_receta_registroConsulta1`
  88.     FOREIGN KEY (`registroConsulta_idregistroConsulta` , `registroConsulta_fichaRegistro_idfichaRegistro`)
  89.     REFERENCES `consultas`.`registroConsulta` (`idregistroConsulta` , `fichaRegistro_idfichaRegistro`)
  90. DEFAULT CHARACTER SET = utf8
  91. COLLATE = utf8_general_ci;
  92.  
  93.  
  94. -- -----------------------------------------------------
  95. -- Table `consultas`.`login_has_fichaRegistro`
  96. -- -----------------------------------------------------
  97. CREATE TABLE IF NOT EXISTS `consultas`.`login_has_fichaRegistro` (
  98.   `login_idlogin` INT NOT NULL,
  99.   `fichaRegistro_idfichaRegistro` INT NOT NULL,
  100.   PRIMARY KEY (`login_idlogin`, `fichaRegistro_idfichaRegistro`),
  101.   INDEX `fk_login_has_fichaRegistro_fichaRegistro1_idx` (`fichaRegistro_idfichaRegistro` ASC),
  102.   INDEX `fk_login_has_fichaRegistro_login1_idx` (`login_idlogin` ASC),
  103.   CONSTRAINT `fk_login_has_fichaRegistro_login1`
  104.     FOREIGN KEY (`login_idlogin`)
  105.     REFERENCES `consultas`.`login` (`idlogin`)
  106.   CONSTRAINT `fk_login_has_fichaRegistro_fichaRegistro1`
  107.     FOREIGN KEY (`fichaRegistro_idfichaRegistro`)
  108.     REFERENCES `consultas`.`fichaRegistro` (`idfichaRegistro`)
  109. DEFAULT CHARACTER SET = utf8
  110. COLLATE = utf8_general_ci;
  111.  
  112.  
  113. SET SQL_MODE=@OLD_SQL_MODE;
  114. SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
  115. SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Saludos y de antemano gracias!

Última edición por gnzsoloyo; 14/07/2015 a las 18:03
  #2 (permalink)  
Antiguo 14/07/2015, 18:07
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, 4 meses
Puntos: 2658
Respuesta: FATAL ERROR: Integrity constraint violation: 1452 Cannot add or update a c

Código MySQL:
Ver original
  1. (`consultas`.`registroConsulta`, CONSTRAINT `fk_registroConsulta_fichaRegistro1`
  2. FOREIGN KEY (`fichaRegistro_idfichaRegistro`)
  3. REFERENCES `fichaRegistro` (`idfichaRegistro`) ON DELETE NO ACTION)'
Mira, sin necesidad de analizar nada, se puede decir que el error es que estás intentando dar de alta un registro en la tabla "registroConsulta", con un valor en el campo "fichaRegistro_idfichaRegistro" que no existe aún en su tabla referida, "fichaRegistro".
La cosa es simple: La PK referida siempre debe existir antes de ser usada en la FK que la apunta.
¿Se entiende?

SIEMPRE deben llenarse los datos de la tabla base ANTES de ser insertados en las tablas dependientes.
__________________
¿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 16/07/2015, 08:51
 
Fecha de Ingreso: julio-2014
Mensajes: 8
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: FATAL ERROR: Integrity constraint violation: 1452 Cannot add or update a c

Hola, disculpa la tardanza, entonces, si no entendí mal, debo añadir como PK "fichaRegistro_idfichaRegistro" en la tabla "fichaRegistro"??.

otra cuestión, esa FK me la genero el mysql workbench, que viene de la relación 1:N de la PK que existe en la tabla fichaRegistro... esta mal el script que me genero mysql workbench o yo lo relacione mal.

Saludos y gracias
  #4 (permalink)  
Antiguo 16/07/2015, 09:41
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, 4 meses
Puntos: 2658
Respuesta: FATAL ERROR: Integrity constraint violation: 1452 Cannot add or update a c

No, no has entendido el tema...

¿Tienes claro lo que es una FOREIGN KEY?

Es un campo o conjunto de campos que se referencia a la PRIMARY KEY de otra tabla, y sólo puede contener valores que existan como PK en la tabla referida.

En principio, eso implica que no puedes apuntar arbitrariamente un campo a cualquier otro de otra tabla. Sólo a la PK y para que sea válido crearla debe ser del mismo tipo de columna, igual rango, charset y collation (estos dos últimos sólo para los datos de tipo cadena).
Ahora bien, el error que se te da suele aparecer en dos situaciones:
1) Estás intentando agregar una constraint FK y existen datos en la tabla de la FK que no existen como PK en la tabla referida.
2) Estás intentando INSERTAR un registro en la tabla de la FK, donde a la FK le estás poniendo un dato que no existe en la PK de la tabla referida.

Nota 1: Como caso exclusivo, MySQL admite crear una FK que no apunte a la PK, pero en ese caso debe apuntar en la tabla referida a un campo declarado como UNIQUE (cumple con el requerimiento de unicidad de valores para una FK).

Nota 2: Cuando se menciona el concepto "conjunto de campos", se hace referencia a que si la tabla a la que se hará referencia tiene una PK definida sobre más de una columna (PK compuesta), la FK se debe construir con la misma cantidad de campos, del mismo tipo, y en el mismo orden de la definición de PK de la tabla referida.

Nota 3: En un INSERT a una tabla con una FK, el valor de la PK a que hará referencia debe existir siempre en la tabla referida antes de intentar insertar el registro que la contiene como FK.
Si lo intentas al revés te fallará.

Posdata: Verifiqué tu script y no tiene ningún defecto formal que pueda generar el error, así que apostaría que los INSERT los estás haciendo incorrectamente.
__________________
¿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; 17/07/2015 a las 07:30

Etiquetas: add, child, constraint, fatal, fecha, php, registro, row, sql, update
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 19:39.