SQL - INSERT a tablas relacionales ¿¿como??

 
Vista:
sin imagen de perfil

INSERT a tablas relacionales ¿¿como??

Publicado por cotarejo (12 intervenciones) el 05/08/2015 19:42:39
Buenas tardes, tengo 4 tablas relacinadas entre sí. que son estas:

CREATE TABLE IF NOT EXISTS `tablaplatos` (
`id_plato` int(15) NOT NULL AUTO_INCREMENT,
`nombre` varchar(50) NOT NULL,
`primerprimero` varchar(100) NOT NULL,
`segundoprimero` varchar(100) NOT NULL,
`tercerprimero` varchar(100) NOT NULL,
`primersegundo` varchar(100) NOT NULL,
`segundosegundo` varchar(100) NOT NULL,
`tercersegundo` varchar(100) NOT NULL,
`primerpostre` varchar(100) NOT NULL,
`segundopostre` varchar(100) NOT NULL,
`tercerpostre` varchar(100) NOT NULL,
`cafe` bit(1) NOT NULL,
`pan` bit(1) NOT NULL,
`id_restaurante` int(11) NOT NULL,
PRIMARY KEY (`id_plato`),
KEY `id_restaurante` (`id_restaurante`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ;



CREATE TABLE IF NOT EXISTS `tablaprecios` (
`id_precio` int(11) NOT NULL AUTO_INCREMENT,
`nombre` varchar(50) NOT NULL,
`precio` int(15) NOT NULL,
`id_restaurante` int(11) NOT NULL,
PRIMARY KEY (`id_precio`),
KEY `id_restaurante` (`id_restaurante`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ;



CREATE TABLE IF NOT EXISTS `tablarestaurantes` (
`id_restaurante` int(11) NOT NULL AUTO_INCREMENT,
`nombre` varchar(50) NOT NULL,
`telefono` int(9) NOT NULL,
`localidad` varchar(50) NOT NULL,
`latitud` float NOT NULL,
`longitud` float NOT NULL,
PRIMARY KEY (`id_restaurante`),
KEY `nombre` (`nombre`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=33 ;



CREATE TABLE IF NOT EXISTS `tablausuarios` (
`id_usuario` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id_usuario`),
KEY `login` (`login`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=230 ;



-- Filtros para la tabla `tablaplatos`
--
ALTER TABLE `tablaplatos`
ADD CONSTRAINT `tablaplatos_ibfk_1` FOREIGN KEY (`id_restaurante`) REFERENCES `tablarestaurantes` (`id_restaurante`) ON DELETE CASCADE ON UPDATE CASCADE;

--
-- Filtros para la tabla `tablaprecios`
--
ALTER TABLE `tablaprecios`
ADD CONSTRAINT `tablaprecios_ibfk_1` FOREIGN KEY (`id_restaurante`) REFERENCES `tablarestaurantes` (`id_restaurante`) ON DELETE CASCADE ON UPDATE CASCADE;

--
-- Filtros para la tabla `tablarestaurantes`
--
ALTER TABLE `tablarestaurantes`
ADD CONSTRAINT `tablarestaurantes_ibfk_2` FOREIGN KEY (`nombre`) REFERENCES `tablausuarios` (`login`) ON DELETE NO ACTION ON UPDATE NO ACTION;



Ahora necesito hacer un INSERT a todas las tablas, lo tenía hecho tal que así:

function alta($pdo, $altanombre, $altalocalidad, $altatelefono, $altaprimerprimero, $altasegundoprimero, $altatercerprimero, $altaprimersegundo, $altasegundosegundo, $altatercersegundo, $altaprimerpostre, $altasegundopostre, $altatercerpostre, $altacafe, $altapan, $altaprecio, $altalatitud, $altalongitud, $altapassword){
$sentencia = $pdo->prepare("INSERT INTO `tablarestaurantes`(`nombre`, `telefono`, `localidad`, `latitud`, `longitud`) VALUES ('".$altanombre."',".$altatelefono.",'".$altalocalidad."',".$altalatitud.",".$altalongitud.")");
$sentencia->execute();
$sentencia2 = $pdo->prepare("INSERT INTO `tablaplatos`(`nombre`, `primerprimero`, `segundoprimero`, `tercerprimero`, `primersegundo`, `segundosegundo`, `tercersegundo`, `primerpostre`, `segundopostre`, `tercerpostre`, `cafe`, `pan`) VALUES ('".$altanombre."','".$altaprimerprimero."','".$altasegundoprimero."','".$altatercerprimero."','".$altaprimersegundo."','".$altasegundosegundo."','".$altatercersegundo."','".$altaprimerpostre."','".$altasegundopostre."','".$altatercerpostre."','".$altacafe."',".$altapan.")");
$sentencia2->execute();
$sentencia3 = $pdo->prepare("INSERT INTO `tablaprecios`(`nombre`, `precio`) VALUES ('".$altanombre."',".$altaprecio.")");
$sentencia3->execute();
$sentencia4 = $pdo->prepare("INSERT INTO `tablausuarios`(`login`, `password`) VALUES ('".$altanombre."','".$altapassword."')");
$sentencia4->execute();
}


Pero en el momento de hacer la relacion con las tablas me dice esto:


Capturaerrorsql



Sé que antes me dejaba porq no estaban las tablas relacionadas, y ahora no me deja por eso mismo...

¿¿Cómo debería de ser la consulta???


Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

INSERT a tablas relacionales ¿¿como??

Publicado por leonardo_josue (1173 intervenciones) el 05/08/2015 20:47:09
Hola Cotarejo:

El error que te está marcando es bastante claro: No puedes insertar un registro en una tabla 'Hija' sin que exista la referencia en la tabla 'Padre'... en otras palabras, tienes un problema en el orden de las inserciones.

Tú estás intentando Insertar así:

1
2
3
4
INSERT INTO `tablarestaurantes`...
INSERT INTO `tablaplatos`...
INSERT INTO `tablaprecios`...
INSERT INTO `tablausuarios`...


Sin embargo, de acuerdo a tus relaciones la tabla RESTAURANTES tiene una referencia a la tbala USUARIOS... por lo tanto, PRIMERO DEBES INSERTAR EL USUARIO, al que se va a hacer referencia.

Lo mismo pasaría si intentaras insertar primero un PLATO o UN PRECIO sin haber insertado el RESTAURANT al que van a hacer referencia. En resumen, cambia tú secuencia así:

1
2
3
4
INSERT INTO `tablausuarios`...
INSERT INTO `tablarestaurantes`...
INSERT INTO `tablaplatos`...
INSERT INTO `tablaprecios`...

Haz la prueba y nos comentas.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

INSERT a tablas relacionales ¿¿como??

Publicado por cotarejo (12 intervenciones) el 05/08/2015 23:18:08
Hola y gracias por contestar.... he probado a cambiar la secuencia de los INSERT, ahora está tal que así:

$sentencia4 = $pdo->prepare("INSERT INTO `tablausuarios`(`login`, `password`) VALUES ('".$altanombre."','".$altapassword."')");
$sentencia4->execute();
$sentencia = $pdo->prepare("INSERT INTO `tablarestaurantes`(`nombre`, `telefono`, `localidad`, `latitud`, `longitud`) VALUES ('".$altanombre."',".$altatelefono.",'".$altalocalidad."',".$altalatitud.",".$altalongitud.")");
$sentencia->execute();
$sentencia2 = $pdo->prepare("INSERT INTO `tablaplatos`(`nombre`, `primerprimero`, `segundoprimero`, `tercerprimero`, `primersegundo`, `segundosegundo`, `tercersegundo`, `primerpostre`, `segundopostre`, `tercerpostre`, `cafe`, `pan`) VALUES ('".$altanombre."','".$altaprimerprimero."','".$altasegundoprimero."','".$altatercerprimero."','".$altaprimersegundo."','".$altasegundosegundo."','".$altatercersegundo."','".$altaprimerpostre."','".$altasegundopostre."','".$altatercerpostre."','".$altacafe."',".$altapan.")");
$sentencia2->execute();
$sentencia3 = $pdo->prepare("INSERT INTO `tablaprecios`(`nombre`, `precio`) VALUES ('".$altanombre."',".$altaprecio.")");
$sentencia3->execute();


y me da este error:

Capturaerrorsql2


Sigue siendo un error de dependencias pero entre lo mal que llevo el inglés y peor que llevo SQL me estoy volviendo loco....


Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

INSERT a tablas relacionales ¿¿como??

Publicado por leonardo_josue (1173 intervenciones) el 06/08/2015 16:56:47
Hola de nuevo cotarejo:

Antes que nada, dos recomendaciones.

1. Este foro es de SQL, por lo tanto SÓLO DEBES COLOCAR CÓDIGO SQL. Todo el código de PHP, o de cualquier otro lenguaje de programación que estés utilizando, está prohibido. Ojo con eso.
2. Utiliza las opciones de edición para el texto, el engrane que aparece junto a la carita feliz, sirve para insertar bloques de código. El que le des formato a tus textos es de gran ayuda. Entre más 'limpieza' y orden tengas es tus post's más sencillo será de entender.

Ahora bien, volviendo a tu problema, quitando todo el código basura de PHP, el insert sobre la tabla que estás haciendo se reduce a esto:

1
INSERT INTO `tablaplatos`(`nombre`, `primerprimero`, `segundoprimero`, `tercerprimero`, `primersegundo`, `segundosegundo`, `tercersegundo`, `primerpostre`, `segundopostre`, `tercerpostre`, `cafe`, `pan`)...

Ahora bien, según la estructura que colocaste en tu primer post, tu tabla es así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE IF NOT EXISTS `tablaplatos` (
`id_plato` int(15) NOT NULL AUTO_INCREMENT,
`nombre` varchar(50) NOT NULL,
`primerprimero` varchar(100) NOT NULL,
`segundoprimero` varchar(100) NOT NULL,
`tercerprimero` varchar(100) NOT NULL,
`primersegundo` varchar(100) NOT NULL,
`segundosegundo` varchar(100) NOT NULL,
`tercersegundo` varchar(100) NOT NULL,
`primerpostre` varchar(100) NOT NULL,
`segundopostre` varchar(100) NOT NULL,
`tercerpostre` varchar(100) NOT NULL,
`cafe` bit(1) NOT NULL,
`pan` bit(1) NOT NULL,
`id_restaurante` int(11) NOT NULL,
PRIMARY KEY (`id_plato`),
KEY `id_restaurante` (`id_restaurante`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ;

Observa que en el INSERT, en la lista de campos NO ESTÁS INCLUYENDO EL ID_RESTAURANTE, por lo tanto el campo se asignará con un NULL, sin embargo ESTA ES UNA VIOLACIÓN A LAS REGLAS DE INTEGRIDAD, porque en tu TABLA RESTAURANTES no puede existir ningún registro que tenga una llave NULA. Lo mismo pasa con la TABLA PRECIOS, sólo estás insertando dos campos:

1
INSERT INTO `tablaprecios`(`nombre`, `precio`)...

Pero tu tabla tiene cuatro campos:

1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS `tablaprecios` (
`id_precio` int(11) NOT NULL AUTO_INCREMENT,
`nombre` varchar(50) NOT NULL,
`precio` int(15) NOT NULL,
`id_restaurante` int(11) NOT NULL,
PRIMARY KEY (`id_precio`),
KEY `id_restaurante` (`id_restaurante`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ;


El campo id_precio NO ES NECESARIO QUE SE INSERTE, ya que es un autoincremental, sin embargo el campo id_restaurant SI DEBES ESPECIFICARLO, de lo contrario tendrás el mismo error que arriba.

Si el RESTAURANT que insertas en el segundo paso es el mismo al que deben hacer referencia las tablas de PLATOS y PRECIOS, entonces primero debes determinar qué ID_RESTAURANTE se le asignó para utilizarlos en los dos últimos INSERT's.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

INSERT a tablas relacionales ¿¿como??

Publicado por cotarejo (12 intervenciones) el 06/08/2015 17:16:15
OK gracias, no sabía que no se podía poner nada de código php aquí, aunque es un foro de SQL llama a una función desde PHP a SQL, para próximas consultas lo omitiré, y mucho menos sabía que el engranaje es para poner el código....

Pues efectivamente como tú bien dices, no sé cómo hacer para que en la tablaplatos el id_restaurante, vaya creciendo a medida que vaya metiendo platos nuevos... es decir, la tablaplatos es esta:


tablaplatosid


como se puede observar, el primer campo se llama id_plato, y es autoincrement, también querría que id_restaurante que es el último campo sea autoincrement pero no me deja tener más de un autoincrement en la misma tabla "y así con todas las tablas". Por eso en el insert no está puesto, ya que lo que quiero es ir añadiendo los campos necesarios a la tablaplatos, tablaprecios, tablarestaurantes y tablausuarios, y que los campos que utilizo para relacionar las tablas se vayan autoincrementando solos para que siempre coincidan unos con otros de unas tablas a otras


¿¿Cómo podría hacerlo??

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar