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

[SOLUCIONADO] Error constraint. Qúe pasa aquí?

Estas en el tema de Error constraint. Qúe pasa aquí? en el foro de Mysql en Foros del Web. este es el código de mis dos tablas generado con MySQL Workbench. Cita: SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; CREATE SCHEMA IF ...
  #1 (permalink)  
Antiguo 30/05/2013, 13:01
Avatar de aitornillo  
Fecha de Ingreso: abril-2013
Mensajes: 12
Antigüedad: 11 años
Puntos: 0
Error constraint. Qúe pasa aquí?

este es el código de mis dos tablas generado con MySQL Workbench.

Cita:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`Login`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Login` (
`id_login` INT NOT NULL AUTO_INCREMENT ,
`email` VARCHAR(40) NOT NULL ,
`password` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id_login`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Question`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Question` (
`id_question` INT NOT NULL AUTO_INCREMENT ,
`qstns` CHAR(100) NOT NULL ,
`modificado` TIMESTAMP NOT NULL ,
`id_fk` INT NOT NULL ,
PRIMARY KEY (`id_question`) ,
INDEX `id_fk` (`id_fk` ASC) ,
CONSTRAINT `id_fk`
FOREIGN KEY (`id_fk` )
REFERENCES `mydb`.`Login` (`id_login` )
ON DELETE NO ACTION
ON UPDATE CASCADE)
ENGINE = InnoDB;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Al insertar un nuevo dato en la segunda tabla, la que tiene el FK al ID de la primera tabla, me tira este error:

Cita:
Cannot add or update a child row: a foreign key constraint fails (`mydb`.`qstns`, CONSTRAINT `qstns_ibfk_1` FOREIGN KEY (`id_fk`) REFERENCES `login` (`id_login`))
He estado leyendo mucho sobre este error y veo que es porque intento meter algo que no existe en la tabla padre :S

Qué pasa? cómo lo arreglo?
  #2 (permalink)  
Antiguo 30/05/2013, 13:30
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Error constraint. Qúe pasa aquí?

Hola aitornillo:

Creo que la respuesta es obvia, (o igual y no lo es tanto para tí ). Primero responde, ¿cuál es el propósito de las llaves foráneas?. La idea es poder enlazar dos tablas que están relacionadas... y si esta relación es imperante, es decir, DEBE EXISTIR SI O SI (si no, entonces no tiene caso utilizar llaves foráneas).

si tal como lo comentas,

Cita:
es porque intento meter algo que no existe en la tabla padre :S
Lo que tienes que hacer es verificar que la información que estás tratando de ingresar en la tabla hija EXISTA EN LA TABLA PADRE... En otras palabras el error es que estás intentando ingresar un registro en tu tabla "Question" con un id_fk que no corresponde a ningún id_login de tu tabla "Login"

Saludos
Leo.
  #3 (permalink)  
Antiguo 30/05/2013, 13:34
Avatar de aitornillo  
Fecha de Ingreso: abril-2013
Mensajes: 12
Antigüedad: 11 años
Puntos: 0
Respuesta: Error constraint. Qúe pasa aquí?

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola aitornillo:

Creo que la respuesta es obvia, (o igual y no lo es tanto para tí ). Primero responde, ¿cuál es el propósito de las llaves foráneas?. La idea es poder enlazar dos tablas que están relacionadas... y si esta relación es imperante, es decir, DEBE EXISTIR SI O SI (si no, entonces no tiene caso utilizar llaves foráneas).

si tal como lo comentas,



Lo que tienes que hacer es verificar que la información que estás tratando de ingresar en la tabla hija EXISTA EN LA TABLA PADRE... En otras palabras el error es que estás intentando ingresar un registro en tu tabla "Question" con un id_fk que no corresponde a ningún id_login de tu tabla "Login"

Saludos
Leo.
Gracias por tu respuesta. El caso es que estoy comprobando y sí que existe, o sea, id_fk apunta a id_login y sí que existen los datos porque lo estoy viendo, es decir:

INSERT INTO qstns (qstns,id_fk) VALUES ('".$qstn_new."','".$_SESSION['user_id']['id_login']."')"

id_login es 2, lo meto en id_fk que a su vez sí que existe también en id_login de la tabla padre :S

Espero haberme explicando, estoy aprendiendo por mi cuenta esto.
  #4 (permalink)  
Antiguo 30/05/2013, 13:39
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: Error constraint. Qúe pasa aquí?

MySQL no se equivoca jamás con este tipo de cosas, por lo que si o si debe existir un defecto al momento de ejecutar la consulta.
Mi sugerencia es que, a nivel de PHP, hagas un previo echo de la query, a fin de ver en pantalla qué es lo que realmente está recibiendo MySQL para generar ese fallo.
Es muy probable que las variables no contengan, en ese punto, lo que tu supones que deben contener.
En cualquier caso, intenta hacer esa misma consulta con valores reales, usando phpMyadmin, y verifica si te da o no un fallo.
__________________
¿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 30/05/2013, 13:51
Avatar de aitornillo  
Fecha de Ingreso: abril-2013
Mensajes: 12
Antigüedad: 11 años
Puntos: 0
Respuesta: Error constraint. Qúe pasa aquí?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
MySQL no se equivoca jamás con este tipo de cosas, por lo que si o si debe existir un defecto al momento de ejecutar la consulta.
Mi sugerencia es que, a nivel de PHP, hagas un previo echo de la query, a fin de ver en pantalla qué es lo que realmente está recibiendo MySQL para generar ese fallo.
Es muy probable que las variables no contengan, en ese punto, lo que tu supones que deben contener.
En cualquier caso, intenta hacer esa misma consulta con valores reales, usando phpMyadmin, y verifica si te da o no un fallo.
A ver si me consigo explicar jeje.

Tengo dos tablas, login y qstns.

En login tengo: ID_login:1, EMAIL: hola@hola, PASSWORD: hola.

En qstns tengo ID:1, QSTNS: hola hola, ID_FK:1 [según lo estudiado tengo fk aquí que va a id_login de la otra tabla.

Mi propósito es guardar un comentario y que sea del usuario con ID=1 de la tabla LOGIN. Por lo tanto el código de la consulta es:

Cita:
INSERT INTO qstns (qstns,id_fk) VALUES ('".$qstn_new."','".$_SESSION['user_id']['id_login']."')"
El error sé que me viene del maldito id_fk, le inserto el valor 1 que a su vez ya existe en la tabla login, por lo tanto pertenecería al usuario con ID 1.

No sé si estoy en lo correcto :S
  #6 (permalink)  
Antiguo 30/05/2013, 14:08
Avatar de aitornillo  
Fecha de Ingreso: abril-2013
Mensajes: 12
Antigüedad: 11 años
Puntos: 0
Respuesta: Error constraint. Qúe pasa aquí?

Vale ya está, al usar $_SESSION para ingresar el valor a la base de datos se me olvidó hacer un session_start(); Menuda gilipoyez jjaaja, muchísimas gracias.
  #7 (permalink)  
Antiguo 30/05/2013, 15:38
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: Error constraint. Qúe pasa aquí?

Como te dije, MySQL no comete errores en ese 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)

Etiquetas: constraint, insert, sql, tabla
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:09.