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

Problema Foreign Key Nula

Estas en el tema de Problema Foreign Key Nula en el foro de Mysql en Foros del Web. Hola a todos, os explico. Tengo esta tabla: Código HTML: CREATE TABLE `partido` ( `id` int(5) NOT NULL auto_increment, `temporada_id` int(5) NOT NULL, `competicion_id` int(5) ...
  #1 (permalink)  
Antiguo 31/08/2009, 11:15
 
Fecha de Ingreso: diciembre-2007
Mensajes: 77
Antigüedad: 16 años, 3 meses
Puntos: 3
Exclamación Problema Foreign Key Nula

Hola a todos, os explico.

Tengo esta tabla:
Código HTML:
CREATE TABLE `partido` (
 `id` int(5) NOT NULL auto_increment,
 `temporada_id` int(5) NOT NULL,
 `competicion_id` int(5) NOT NULL,
 `local_id` int(5) NOT NULL,
 `visitante_id` int(5) default NULL,
 `fecha` varchar(10) collate utf8_unicode_ci NOT NULL,
 PRIMARY KEY  (`id`),
 UNIQUE KEY `local_id` (`local_id`,`visitante_id`,`fecha`),
 KEY `temporada_id` (`temporada_id`),
 KEY `competicion_id` (`competicion_id`),
 KEY `visitante_id` (`visitante_id`),
 CONSTRAINT `partido_ibfk_1` FOREIGN KEY (`temporada_id`) REFERENCES `temporada` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `partido_ibfk_2` FOREIGN KEY (`competicion_id`) REFERENCES `competicion` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `partido_ibfk_3` FOREIGN KEY (`local_id`) REFERENCES `equipo` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `partido_ibfk_4` FOREIGN KEY (`visitante_id`) REFERENCES `equipo` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Y el problema lo tengo al ejecutar esta consulta:

Código HTML:
INSERT INTO partido VALUES (
	'',
	'$temporada',
	'$competicion',
	'$equipo',
	'',
	'$fecha'
)
El valor de visitante_id deberia poder ser nulo. Si agrego una linea mediante el INSERT de phpmyadmin no me tira ningun error, pero al hacer insert mediante SQL me lanza el siguiente error:

Código HTML:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`playascs_playas/partido`, CONSTRAINT `partido_ibfk_4` FOREIGN KEY (`visitante_id`) REFERENCES `equipo` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
He probado a poner NULL en el valor del insert, pero el resultado es el mismo.
Alguien me puede ayudar. Por favor, es urgente.
  #2 (permalink)  
Antiguo 31/08/2009, 12:15
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: Problema Foreign Key Nula

Los campos que envías nulos, simplemente no los pongas, pero deberás listar qué campos ingresas:
Código sql:
Ver original
  1. INSERT INTO partido(temporada,competicion, visitante_id, fecha)
  2. VALUES ('$temporada', '$competicion','$equipo', '$fecha');
__________________
¿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 31/08/2009, 12:42
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Problema Foreign Key Nula

el campo id no puede ser ''. ya que es primary key auto_increment.
En cuanto a visitante, debes ingrear un visitante_id existente en la tabla visitante ya que las tablas están relacionadas.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 31/08/2009, 12:43
 
Fecha de Ingreso: diciembre-2007
Mensajes: 77
Antigüedad: 16 años, 3 meses
Puntos: 3
Respuesta: Problema Foreign Key Nula

Muchas gracias por la contestacion. Si defino los campos, funciona perfectamente.

De todas for he averiguado el error en mi sentencia. Para declarar un valor null no vale poner ni vacio (''), ni null ('NULL'), sino que se debe definir asi (NULL), sin comillas:

Código HTML:
INSERT INTO partido VALUES (
	'',
	'$temporada',
	'$competicion',
	'$equipo',
	NULL,
	'$fecha'
)
Muchas gracias de nuevo, me has ayudado a solucionar el problema utilizando la sentencia sin definicion de columnas, la cual me interesa mas, por ahorrar codigo.

Cordiales saludos
  #5 (permalink)  
Antiguo 31/08/2009, 16:04
 
Fecha de Ingreso: diciembre-2007
Mensajes: 77
Antigüedad: 16 años, 3 meses
Puntos: 3
Respuesta: Problema Foreign Key Nula

Bueno, ahora les planteo el siguiente problema 100% relacionado.

En el caso del formulario anterior, tenia la completa certeza del que el campo tenia que ser nulo.

Ahora el problema es que tengo un formulario el cual tiene campos que pertenecen a un campo foreign key (SI NULL). Estos campos pueden tener valor o no, y no hay forma de introducirlos de forma correcta(lanza el mismo error), ni de la forma que yo expuse(sin declarar los campos), ni de la forma que expuso el compañero (declarando los campos).

La unica forma que se me ha ocurrido es esta:
Código PHP:
if($goles1_persona[$i] == ""){
    
$goles1_persona[$i] = "NULL";
}else{
    
$goles1_persona[$i] = "'$goles1_persona[$i]'"//esto lleva comillas !!
}

    
$db = new MySQL();
    
$sql "
                    INSERT INTO gol VALUES (
                '',
            $goles1_persona[$i],
            '$equipo1',
            '$id',
            '$goles1_minuto[$i]'
            )
    "
;
    
$consulta $db->consulta($sql); 
Haber si alguien sabe que esta pasando, o me da una solucion menos guarra...
Saludos a todos
  #6 (permalink)  
Antiguo 31/08/2009, 16:40
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: Problema Foreign Key Nula

Una FK no puede ser NULL porque eso no cumpliría con la restricción de PK: Si la PK no puede ser nula, y la FK apunta a ella, evidentemente hereda la restricción.
El único caso en que MySQL acepta una FK nula es cuando la tabla referida no tiene PK sino un indice UNIQUE, el cual debe estar definido sobre un campo NULL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 31/08/2009, 16:54
 
Fecha de Ingreso: diciembre-2007
Mensajes: 77
Antigüedad: 16 años, 3 meses
Puntos: 3
Respuesta: Problema Foreign Key Nula

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Una FK no puede ser NULL porque eso no cumpliría con la restricción de PK: Si la PK no puede ser nula, y la FK apunta a ella, evidentemente hereda la restricción.
El único caso en que MySQL acepta una FK nula es cuando la tabla referida no tiene PK sino un indice UNIQUE, el cual debe estar definido sobre un campo NULL.
Mira, eso de que una clave externa no puede ser nula, pienso que no es cierto.

Una clave externa es un campo que apunta a otra tabla, pero esto no quiere decir que no pueda ser nula.
Los principales caso en el que la clave externa no pueda ser nula son:

- En relaciones 1:N, en que la participacion de la otra tabla externa es completa.
- En relacion de identidad, en la que la clave principal esta constituida por varios campos (o uno solo), y uno de estos campos en una clave externa.

Quiza si te expico esto, veras que estas equivocado. Cuando defines una clave externa, puedes usar varias opciones: ON DELETE y ON UPDATE. Los parametros que se pueden usar con estas opciones son principalmente.

- CASCADE: Borrar o actualizar en cascada.
- SET NULL: Actualizar el campo al valor NULL.

Con lo cual, cuando defines una clave externa y le pones por ejemplo ON UPDATE CASCADE ON DELETE SET NULL, cuando elimines la clave de la tabla relacionada, esta cambiara a null el valor de campo de los registros de las otras tablas que estan relacionadas y cuando lo cambies o acualices, lo cambiara en todas las tablas relacionadas.
  #8 (permalink)  
Antiguo 01/09/2009, 05:40
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: Problema Foreign Key Nula

Cita:
Quiza si te expico esto, veras que estas equivocado. Cuando defines una clave externa, puedes usar varias opciones: ON DELETE y ON UPDATE. Los parametros que se pueden usar con estas opciones son principalmente.

- CASCADE: Borrar o actualizar en cascada.
- SET NULL: Actualizar el campo al valor NULL.
No estoy completamente equivocado, ya que según el manual de referencia de MySQL:
Cita:
SET NULL: Borra o actualiza el registro en la tabla padre y establece en NULL la o las columnas de clave foránea en la tabla hija. Esto solamente es válido si las columnas de clave foránea no han sido definidas como NOT NULL. MySQL 5.0 soporta tanto ON DELETE SET NULL como ON UPDATE SET NULL.
Por lo que en cualquier otra situación, la restricción está activa.
En todo caso puedes decir que me había olvidado de agregar esta posibilidad.

Tal vez mi mayor error sea teórico: Cuando pongo una FK, es porque necesito esa integridad referencial. Ponerla por si se necesita, no se me da en muchos casos, así que rara vez la tengo en cuenta.... Habitualmente en ese caso administro el problema a nivel de aplicación (formularios), para evitar que el usuario ponga cosas sin sentido.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 01/09/2009, 07:06
 
Fecha de Ingreso: diciembre-2007
Mensajes: 77
Antigüedad: 16 años, 3 meses
Puntos: 3
Respuesta: Problema Foreign Key Nula

Vaya vaya, que me digas que no estabas completamente equivocado porque no habias tenido en cuenta que el campo tenia que der definido podia ser null, me parece una tonteria muy grande, ya que si no se define asi claro que es imposible que sea nula.

Respecto a lo arreglarlo en formularios y demas, una base de datos bien construida (osea, una BD relacional), no puede dar pie a errores y una clave externa puede ser nula si o si, todo depende de la relacion.

Si quieres seguimos discutiendo, pero no es lo que me interesa comentar. Simplemente centremonos en el problema.
  #10 (permalink)  
Antiguo 01/09/2009, 10:17
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Problema Foreign Key Nula

Cita:
INSERT INTO gol VALUES (
'',
$goles1_persona[$i],
'$equipo1',
'$id',
'$goles1_minuto[$i]'
)
esta es tu sentencia inicial, pero no tiene ningún sentido. Si es posible o no insertar un null en una foreign key, no descarta que no controles esto al momento de hacer un simple insert.

Se supone que una relación se crea para mantener la consistencia de una base de datos y evitar información redundante y la clausula set null es muy útil cuando la llave a borrar, no solo depende de la tabla si no de otras mas, pero nunca para hacer lo que tratas.

No tiene sentido crear una relación para ingresar valores vacíos o nulos. Si el registro que tratas de insertar en el campo id no sabes a que pegarlo de la otra tabla, crea un registro que se llame no asignado o algo parecido para establecer la relación correctamente.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #11 (permalink)  
Antiguo 01/09/2009, 14:27
 
Fecha de Ingreso: diciembre-2007
Mensajes: 77
Antigüedad: 16 años, 3 meses
Puntos: 3
Respuesta: Problema Foreign Key Nula

Cita:
Iniciado por huesos52 Ver Mensaje
la clausula set null es muy útil cuando la llave a borrar, no solo depende de la tabla si no de otras mas, pero nunca para hacer lo que tratas.

No tiene sentido crear una relación para ingresar valores vacíos o nulos. Si el registro que tratas de insertar en el campo id no sabes a que pegarlo de la otra tabla, crea un registro que se llame no asignado o algo parecido para establecer la relación correctamente.
Lo primero, si una foreign key depende de mas de una tabla entonces no existe la consistencia que tu citas. Hay muchos tipos de relaciones y cada tipo se trata de una manera jugando con todas estas cosas.

Que no le veas sentido a crear una relacion con valores null, no quiere decir que no lo tenga y eso de crear un valor no asignado... quiza en casos, pero yo lo veo una guarreria.

La verdad no se que estudios tendran ustedes respecto a bases de datos, pero yo los tengo muy aprendidos. No quisiera discutir mas sobre este asunto, solo quisiera saber si hay alguien que me pueda solucionar el problema, pues este no esta en la declaracion de FK nulas o no, eso es totalmente correcto.
  #12 (permalink)  
Antiguo 01/09/2009, 15:05
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Problema Foreign Key Nula

Cita:
Que no le veas sentido a crear una relacion con valores null, no quiere decir que no lo tenga y eso de crear un valor no asignado... quiza en casos, pero yo lo veo una guarreria.
guarreria lo que tratas de hacer. Con solo tratar de hacer esto, no pareces tener muy bien aprendidos los conceptos básicos de las bases de datos.

yo todos los días aprendo algo nuevo de estas discusiones y cuando alguien me corrige o me presenta diversas formas de afrontar los problemas le agradezco enormemente. Estas en una actitud prepotente que crees que todo lo sabes y eso me molesta bastante.

Por ahora, no recibirás ningún aporte mío.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #13 (permalink)  
Antiguo 01/09/2009, 15:59
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: Problema Foreign Key Nula

Si insistes..., vamos a tu problema.
Dices que esto:
Código sql:
Ver original
  1. INSERT INTO gol
  2. VALUES ('', $goles1_persona[$i], '$equipo1', '$id', '$goles1_minuto[$i]')
Te da un error, pero no nos pones el mensaje de error, así que solamente podemos suponer que se trata de un error de restricción de FK, ya que has dejado claro que el esquema de tablas está construido y funcionando.

En un INSERT, la única posibilidad de que se produzca ese error es que estés poniendo un valor ilegal, es decir, un valor que viola la integridad referencial. No hay otra posibilidad.
Como no estás poniendo los valores que ingresas, sino las variables de PHP, solamente podemos suponer:
1) Uno de los valores mandatorios no está ingresando. Para saber si es así deberías probar los valores manualmente con una herramienta como el MySQL Query Browser.
2) Tienes un error en el código de PHP, y está ingresando cualquier cosa, por un defecto en la construcción del string. En ese caso, es problema de programación en PHP, y por tanto ajeno a este Foro.

Verifica primero los valores que contiene la sentencia en la variable $sql y luego veremos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 01/09/2009, 17:14
 
Fecha de Ingreso: diciembre-2007
Mensajes: 77
Antigüedad: 16 años, 3 meses
Puntos: 3
Respuesta: Problema Foreign Key Nula

Haber lo primero de todo, leete por favor el post nº4. Ahi explico la nuevo situacion del problema.

Lo segundo, el error, como comentaba en dixo post, es el mimo..
Código HTML:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`playascs_playas/partido`, CONSTRAINT `partido_ibfk_4` FOREIGN KEY (`visitante_id`) REFERENCES `equipo` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
...pero con la FK de la otra tabla la cual cojo el valor de un formulario, y dicho valor puede ser nulo.

Una vez esto, aqui la solucion que encontre para el problema...
Código PHP:
if($goles1_persona[$i] == ""){
    
$goles1_persona[$i] = "NULL";
}else{
    
$goles1_persona[$i] = "'$goles1_persona[$i]'"//esto lleva comillas !!
}

    
$db = new MySQL();
    
$sql "
    INSERT INTO gol VALUES (
                '',
            $goles1_persona[$i],
            '$equipo1',
            '$id',
            '$goles1_minuto[$i]'
            )
    "

... el cual como ya comente, era una manera muy fea para solucionarlo. Osea, que esto funciona perfectamente, pero no lo veo correcto.

Entonces ahora el real problema es si a alguien se le ocurre solucionarlo de otra forma. Simplemente eso.

Espero haberme explicado bien.
  #15 (permalink)  
Antiguo 01/09/2009, 21:03
 
Fecha de Ingreso: abril-2008
Mensajes: 208
Antigüedad: 16 años
Puntos: 2
Respuesta: Problema Foreign Key Nula

Perdón que meta la cuchara, pero.......

¡Que fea manera de pedir ayuda!
  #16 (permalink)  
Antiguo 02/09/2009, 04:19
 
Fecha de Ingreso: diciembre-2007
Mensajes: 77
Antigüedad: 16 años, 3 meses
Puntos: 3
Respuesta: Problema Foreign Key Nula

Cita:
Iniciado por chelodelsur Ver Mensaje
Perdón que meta la cuchara, pero.......

¡Que fea manera de pedir ayuda!
No sabes lo mucho que siento el poder haber dado una mala impresion. No era ni mucho menos mi intencion y por ello pido disculpas si a alguien le sentaron mal mis explicaciones o comentarios.

Sinceramente, el tema se estaba enfocando desde un punto de vista, sobre un tema el cual era correcto completamente.

Gracias a todos por la ayuda de nuevo.
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 04:12.