No puedo insertar registro foráneo a una tabla en php

Soy de nuevo yo Hernán Camilo desde Colombia, espero que se encuentre bien, mi pregunta es la siguiente

Tengo una tabla principar llamada "generales" que tiene una relación de uno a muchos con otra tabla llamada "ejecución", en la tabla generales tengo un campo llamado id_general tipo de dato int(11) y es llave primaria de la mencionada tabla, en la tabla ejecución tengo el mismo campo como llave foránea mismo tipo de dato int(11).

Ahora bien, tengo un formulario llamado guaradar 1.php en donde tengo tres campos de texto.

Año (Va alimentar a la tabla generales) y que al insertarse un registro en dicha tabla en el campo id_general, me va a generar un valor autonumerico, vle recalcar que dicho campo es llave primaria de la tabla generales

Ejtdo (Va alimentar a la tabla ejecución)

Ppto (Va alimentar a la tabla ejecución)

El problema radica es que al insertar un registro en dicha tabla llenando dicho formulario se inserta la informacion en las correspondientes tablas excepto el campo Id_general en la tabla ejecución de donde es llave foránea, no entiendo por que dicho registro no se inserta siendo que hay una relacion en doinde deberia de tomar automaticamente el valor autonumerico de la llave primaria autonumerica id_general de la tabla generales..

1 Respuesta

Respuesta
1

Según lo que entiendo deseas que tu tabla ejecución inserte el valor de el campo id_general recién creado por la inserción de la variable año en el formulario.

La relación que deseas realizar tiene el siguiente flujo a realizar a nivel de programación.

1- Inserta en la tabla generales

2- Rescata el valor del último id generado. (Se realiza haciendo un select ordenando por id de manera descendente con limit 1 o ejecutando la función mysql_insert_id)

3 realizar el insert en la tabla ejecución entregando como parámetro el último id generado.

Pese a que hay una relación de llaves entre las tablas, esta solo protege los registros en caso que se quieran modificar, eliminar o que se realice una inserción si correspondencia de índices. No te ayudará en el momento del insert a que las tablas busquen de manera automática que campo es su llave foránea, esta información la tienes que entregar tu en el momento del insert.

Hola muchas gracias Estoy utilizando Mysql workbench, no hay una manera de realizar esto en cascada como suele hacerse en Access o sql server,.,,pòrmque esta muy bien el método que propones pero se me hace algo engorroso para desarrollarlo en php,,,un abrazo!.

Se puede hacer en cascada, de hecho hay 5 opciones para hacerlo en mysql

<a>http://dev.mysql.com/doc/refman/5.0/es/innodb-foreign-key-constraints.html</a>

Pero cuando establezcas la relación en la sentencia sql, necesariamente tienes que entregar en el insert, la llave foránea ya que mysql no es "adivino" para saber que deseas hacer un insert con relación a una tabla específica y menos a un registro de esa tabla.

Si, ya lo hice en cascada en la propiedad de la tabla y la relación dentro de Mysql Workbench, pero como realizaría el insert, por favor por que es sencillo cuando provene de un cuadro de texto cando el usuario inserta eso se haría con un insert, pero cuando este es automático e ahí el problema..

Gracias :)

Como te he comentado, asignar variables a la consulta no es automático, necesariamente necesitas el último valor insertado en tu "tabla padre"

Cordial saludo:

Pues hago lo siguiente pero no veo por que no se me deja insertar registros:

<!--?php <br ?-->if (isset($_POST['Anio'])) {
$Anio=$_POST['Anio'];
}
if (isset($_POST['Ppto'])) {
$Ppto=$_POST['Ppto'];
}
if (isset($_POST['Ejtdo'])) {
$Ejtdo=$_POST['Ejtdo'];
}
include("conexión.php");
$query=mysql_query("SELECT Id_general FROM generales order by Id_general DESC LIMIT 1"); /*Consulta que usted me dijo que hiciera*/
$mysql="INSERT INTO generales(Anio) values($Anio)";
$mysql1="INSERT INTO ejecución(Ppto,Ejtdo,Id_general) values($Ppto,$Ejtdo,$query)";
mysql_query($mysql,$conexión) or die (mysql_error());
mysql_query($mysql1,$conexión) or die (mysql_error());
echo "Dato insertado";
mysql_close();
?>

Al ejecutar la pagina e insertar los registros en los campos Anio,Ppto y Ejtdo

me aparece el siguiente error:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id #5)' at line 1

No se por que se me muestra este error siendo, que todo esta bien..

Gracias y que pena la molestia..

Tienes que poner atención en lo que haces y analizar el flujo de la programación tal cual te he comentado anteriormente.

El flujo que te propuse es el siguiente:

1- Inserta en la tabla generales
2- Rescata el valor del último
Id generado. (Se realiza haciendo un select ordenando por id de manera
descendente con limit 1 o ejecutando la función mysql_insert_id)
3 realizar el insert en la tabla ejecución entregando como parámetro el último id generado.

Te enseñare lo que has hecho

$query=mysql_query("SELECT Id_general FROM generales order by Id_general DESC LIMIT 1"); 
/*Consulta que usted me dijo que hiciera*/
$mysql="INSERT INTO generales(Anio) values($Anio)";
$mysql1="INSERT INTO ejecución(Ppto,Ejtdo,Id_general) values($Ppto,$Ejtdo,$query)";

Si te das cuenta has invertido el punto 1 con el punto dos, has rescatado el insert que se ejecutó en otro flujo (porque después haces el insert del punto 1) y guardas el resultado de la consulta (no el id que rescataste como insert) en la variable Anio.

La variable $query es la que te está dando problemas ya que no contiene el resultado del ultimo insert si no la respuesta que entrega mysql_query a esa ejecución de insert.

Haz lo siguiente:

$mysql="INSERT INTO generales(Anio) values($Anio)";
mysql_query($mysql,$conexión) or die (mysql_error());
$ultimo_insert = mysql_insert_id();
$mysql1="INSERT INTO ejecución(Ppto,Ejtdo,Id_general) values($Ppto,$Ejtdo,$ultimo_insert)";
mysql_query($mysql1,$conexión) or die (mysql_error());
echo "Dato insertado";
mysql_close();

Probemos con esto y veamos si funciona.

Como consejo te recomiendo que a esta altura trabajes en papel los flujos del código que deseas realizar pseudocódigo ya que creo que tienes ciertos problemas en esa actividad. De esta forma podrás entrenar soluciones a futuro en tu cabeza sin necesidad de hacer tanto análisis y minimizando el porcentaje de error de tus ejecuciones.

Hola muchas gracias,,,estuve analizando y es obvio de q

Hola muchas gracias,,,estuve analizando y comprendí de que no debo insertar registros sin antes capturar el ultimo id con la función mysql_insert_id();

Pero desafortunadamente el php no me deja insertar registros, pues al querer realizar el proceso de insertar registros y oprimir el botón "Insertar datos", me aparece el siguiente error:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '³n(Ppto,Ejtdo,Id_general) values('444333222110','77899000','56')' at line 1

A que se deberá ese error ,, ya que viendo y probando con distintos tipos de sintaxis me sale el mismo error..

Gracias.

Copiaste la query con acentos

Por eso esta el error. Quita los acentos y vuelve a ejecutar

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas