Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Cannot add or update a child row: a foreign key constraint fails Al dejar campo NULL

Estas en el tema de Cannot add or update a child row: a foreign key constraint fails Al dejar campo NULL en el foro de PHP en Foros del Web. Buenas tardes. espero que me puedan ayudar. Tengo un problema al cargar un registro a mi base de datos. cuando yo ingreso todos los datos ...
  #1 (permalink)  
Antiguo 18/12/2013, 13:53
 
Fecha de Ingreso: octubre-2012
Mensajes: 35
Antigüedad: 11 años, 6 meses
Puntos: 0
Cannot add or update a child row: a foreign key constraint fails Al dejar campo NULL

Buenas tardes.
espero que me puedan ayudar.

Tengo un problema al cargar un registro a mi base de datos.
cuando yo ingreso todos los datos se me insertan correctamente.
pero el problema va cuando yo dejo un campo vacio uno de los campos en las que va la clave o llave foránea. sabiendo que yo esos campos los deje como NULL al crear mi tabla de la b.d.

Cuando yo ingreso los datos directamente desde el phpmyadmin y dejo un campo FOREIGN KEY vació hay si me guarda perfectamente y me adminte el campo vacio( NULL).

pero cuando lo hago desde mi tabla que yo cree me sale este error:
Error: Cannot add or update a child row: a foreign key constraint fails
que me sale porque no le asigne o deje ese campo vació.

esta es mi estructura de mi de dos tablas de mi b.d exportada del phpmyadmin:

Código:
--
-- Estructura de tabla para la tabla `estudiante`
--

CREATE TABLE IF NOT EXISTS `estudiante` (
  `cedula_estudiante` int(11) NOT NULL,
  `modalidad_estudiante` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  `nombres_estudiante` varchar(70) COLLATE utf8_unicode_ci NOT NULL,
  `apellidos_estudiante` varchar(70) COLLATE utf8_unicode_ci NOT NULL,
  `telefonos_estudiante` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL,
  `correo` varchar(99) COLLATE utf8_unicode_ci NOT NULL,
  `profesion` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  `ciudad` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  `estado` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  `observaciones` mediumtext COLLATE utf8_unicode_ci,
  `codigo_linea` int(11) NOT NULL,
  `codigo_proyecto` int(11) DEFAULT NULL,
  `codigo_cohorte` int(20) DEFAULT NULL,
  PRIMARY KEY (`cedula_estudiante`),
  UNIQUE KEY `correo` (`correo`),
  UNIQUE KEY `codigo_proyecto` (`codigo_proyecto`),
  KEY `codigo_cohorte` (`codigo_cohorte`),
  KEY `codigo_linea` (`codigo_linea`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


--
-- Filtros para la tabla `estudiante`
--
ALTER TABLE `estudiante`
  ADD CONSTRAINT `estudiante_ibfk_1` FOREIGN KEY (`codigo_linea`) REFERENCES `linea` (`codigo_linea`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `estudiante_ibfk_2` FOREIGN KEY (`codigo_proyecto`) REFERENCES `proyectos` (`codigo_proyecto`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `estudiante_ibfk_3` FOREIGN KEY (`codigo_cohorte`) REFERENCES `cohorte` (`codigo_cohorte`);

miren que yo los campos FOREIGN KEY LOS tengo como NULL.
Lo que yo quiero es que yo pueda dejar algunos de estos campos vacios sin que me genere ese error.

estos son los campos de la tabla que son FOREIGN KEY.
codigo_proyecto
codigo_cohorte
codigo_linea

por ejemplo yo voy asignar un estudiante. listo agrego todos los datos de el.
pero si todavía no le tengo asignado un proyecto entonces que yo pueda dejar ese campo vació sin que me genere error.

no se si tenga que agregarle algo a mi código PHP o es problema de mi base de datos. no se.
porque es que estoy confundido de porque en phpmyadmin si me deja agregar el registro dejando esa campo vació ("codigo_proyecto" que es FOREIGN KEY) y desde mi formulario que yo cree me sale ese error.

Espero que me puedan ayudar.
Se los agradecería mucho.
  #2 (permalink)  
Antiguo 18/12/2013, 14:06
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: Cannot add or update a child row: a foreign key constraint fails Al dejar

Cita:
pero el problema va cuando yo dejo un campo vacio uno de los campos en las que va la clave o llave foránea. sabiendo que yo esos campos los deje como NULL al crear mi tabla de la b.d.
Aclaremos un detalle, por las dudas, ya que mencionas que los inserts fallan cuando lo haces en la aplicación: Un campo es NULL cuando lo omites en el INSERT, o cuando le especificas NULL al valor correspondiente.
Además hay que recordar que NULL no es lo mismo que 'NULL'. El primero es el nulo, y el otro es una cadena de texto que dice "NULL", y para la base de datos no es lo mismo.
¿Qué significa esto?
Pues que si tienes una tabla, por ejemplo
TablaA(a, b, c, d, e)
donde el campo b puede ser nulo, no es lo mismo esto:
Código MySQL:
Ver original
  1. INSERT INTO A VALUES(1, NULL, 3, 4)
que esto:
Código MySQL:
Ver original
  1. INSERT INTO A VALUES(1, 'NULL', 3, 4)
Ni tampoco eso:
Código MySQL:
Ver original
  1. INSERT INTO A VALUES(1, '', 3, 4)
El primer caso está bien, el segundo podría dispara un error de tipo de dato, y el tercero dispararía un error si el campo "b" fuese FK, porque el espacio vacío no es un NULL.

¿Cuál es la forma que usas tu para definir NULL, según queda armado por programación?
__________________
¿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 18/12/2013, 14:23
 
Fecha de Ingreso: octubre-2012
Mensajes: 35
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Cannot add or update a child row: a foreign key constraint fails Al dejar

Muchisimas Gracias. jajaja
claro era por eso que me dijiste.
es que yo en mi html los tenia asi:

Código PHP:

<tr>
                <?php
                    $query 
"SELECT p.codigo_proyecto, p.nombre_proyecto FROM proyectos p WHERE NOT EXISTS (SELECT * FROM estudiante e WHERE p.codigo_proyecto = e.codigo_proyecto)";
                    
$resul mysql_query($query);
                
?>    
                    <td><strong>Proyecto:</strong></td>
                    <td><select name="codigo_proyecto" id="proyecto">
                        <OPTION VALUE="">Seleccione..</OPTION>
                <?php
                    
while ($row mysql_fetch_array($resul)){
                        echo 
"<option  value='".$row['codigo_proyecto']."'>".$row['nombre_proyecto']."</option>";
                    }
                
?>                                                    
                </select></td>                      
            </tr>
Donde Value lo tenia como:

Código PHP:

<OPTION VALUE="">Seleccione..</OPTION
y ahora lo hice como tu me dijiste:

Código PHP:

<OPTION VALUE="NULL">Seleccione..</OPTION
Muchas gracias por tu ayuda.
ya me estaba volviendo loco.
  #4 (permalink)  
Antiguo 18/12/2013, 14:26
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: Cannot add or update a child row: a foreign key constraint fails Al dejar

Movido para no eliminar el codigo proghramado (OFF TOPIC en MySQL)
__________________
¿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 19/12/2013, 07:25
 
Fecha de Ingreso: octubre-2012
Mensajes: 35
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Cannot add or update a child row: a foreign key constraint fails Al dejar

otra cosa que quiero agregar es que en el insert into no deben enserrar los foreign key ni con comillas simples ni dobles: asi como lo explica gnzsoloyo.

voy a poner el insert ito que yo tengo por si alguien le queda alguna duda:

Código PHP:
Ver original
  1. $this->query = "INSERT INTO estudiante VALUES('$this->cedula_estudiante', '$this->modalidad_estudiante', '$this->nombres_estudiante', '$this->apellidos_estudiante',
  2.                           '$this->telefonos_estudiante', '$this->correo', '$this->profesion',
  3.                           '$this->ciudad', '$this->estado', '$this->observaciones', $this->codigo_linea, $this->codigo_proyecto, $this->codigo_cohorte)";
  4.  
  5. observen que los tres últimos ( $this->codigo_linea, $this->codigo_proyecto, $this->codigo_cohorte) les quite las comillas simples porque o si no NULL no va a quedar como una palabra reservada si no cono un texto mas en la tabla.
  6.  
  7. y los demas campos si los deje encerrado entre comillas simples('$this->cedula_estudiante', '$this->modalidad_estudiante', '$this->nombres_estudiante', '$this->apellidos_estudiante',
  8.                            '$this->telefonos_estudiante', '$this->correo', '$this->profesion',
  9.                            '$this->ciudad', '$this->estado', '$this->observaciones').

Etiquetas: campo, key, mysql, null
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:02.