MySQL - Escribir datos en llave foranea

 
Vista:
sin imagen de perfil

Escribir datos en llave foranea

Publicado por sodro (2 intervenciones) el 11/07/2017 18:31:24
Hola!

tengo el sgte problema.

tengo un programa hecho en java con user y pass conetado a mi DB Funcionando, esto quiere decir que mi clase de conccion con la DB está bien hecha.

tengo el sgte formulario a llenar en la interfaz grafica, para el ingreso de datos de mi trabajador:

Nombre
Apellido Paterno
Apellido Materno
Fecha de nacimiento
Direccion
Email
Teléfono

y en mi DB tengo la tabla trabajador con las columnas

idTrabajador (PK) (AI)
nombreTrabajador
apellidoPaternoTrabajador
apellidoMaternoTrabajador
fecNacTrabajador
direccionTrabajador (FK)
emailTrabajador (FK)

logro escribir y registrar datos en mi base de daton en los campos Nombre, Apellido Paterno, Apellido Materno y Fecha de nacimiento sin problema con un metodo:

1
2
3
4
5
6
7
8
9
10
11
public String crearTrabajador (String nombreTrabajador, String  apellidoPaternoTrabajador, String apellidoMaternoTrabajador, String fecNacTrabajador) throws SQLException, IOException, ClassNotFoundException{
Connection con=null; //Objeto de  clase Connection 
Conexion CNX = new Conexion(); //Objeto de mi clase donde esta la conexion a mi base de datos
String query= "INSERT INTO trabajador (nombreTrabajador, apellidoPaternoTrabajador, apellidoMaternoTrabajador, fecNacTrabajador)"
+ "VALUES ('"+nombreTrabajador+"','"+apellidoPaternoTrabajador+"','"+apellidoMaternoTrabajador+"','"+fecNacTrabajador+"');";
PreparedStatement SQL=null; //Instancio el Statement
 
SQL = con.preparedStatement(query); //ingreso la Query a la DB
SQL.execute(); //Ejecuto la Query
CNX.close(); //Cierro la conexion
}

Ete metodo funciona correctamente ya que escribe en DB y hago lo mismo para escribir en el la tabla de direccion

mi tabla direccion tiene las sgtes columnas

idDireccion (PK) (AI)
direccionDireccion
Comuna(FK) //Todavia no llego a esto, asi que estacolumna es irrelevante

1
2
3
4
5
6
7
8
9
10
11
public String crearDireccion (String direccionDireccion) throws SQLException, IOException, ClassNotFoundException{
Connection con=null; //Objeto de  clase Connection 
Conexion CNX = new Conexion(); //Objeto de mi clase donde esta la conexion a mi base de datos
String query= "INSERT INTO direccion (direccionDireccion)"
+ "VALUES ('"+direccionDireccion+"');";
PreparedStatement SQL=null; //Instancio el Statement
 
SQL = con.preparedStatement(query); //ingreso la Query a la DB
SQL.execute(); //Ejecuto la Query
CNX.close(); //Cierro la conexion
}

esto escribe sin ni un problema en la DB, pero la columna idDireccion de mi tabla direccion no me queda "linkeada" a la colmna direccionTrabajador de mi tabla trabajador
osea, en esta tabla mi columna direccionTrabajador queda null cuando deberia tener referenciado el idDireccion desde mi tabla direccion

Que puedo hacer?

desde ya, 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: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Escribir datos en llave foranea

Publicado por leonardo_josue (414 intervenciones) el 11/07/2017 20:06:10
Hola sodro:

Creo que estás un tanto "perdido" con esto de las llaves foráneas y la programación en JAVA... vamos primero a cuestiones que tienen que ver con el propósito de este foro que es Base de Datos y dejaremos las cuestiones de JAVA para el foro pertinente...

Veo varios problemas en tu planteamiento, y trataré de ser lo más claro posible.

Primero, de acuerdo a la definición de tus tablas, el campo direccionTrabajador de tu tabla TRABAJADOR] es una llave foránea al campo idDirección de tu tabla DIRECCION, ¿correcto?

Al tener esta relación, entonces DEBE EXISTIR PRIMERO UN REGISTRO EN DIRECCION para poder ser referenciado en la tabla TRABAJADOR, en otras palabras, primero debes INSERTAR la dirección antes que los datos del empleado.

Segundo, en tu sentencia INSERT no estás enviando los datos de tu campo llave idDireccion, por lo que puedo suponer que se trata de un campo autoincremental, ¿correcto?

1
INSERT INTO direccion (direccionDireccion) VALUES ('direccionDireccion');

al hacer este INSERT entonces dejas que el campo llave se genere de manera automática... sin embargo, ¿cómo puedes saber cuál fue este valor que le asignó? la respuesta es que no lo sabes hasta que hagas una consulta nuevamente sobre la tabla DIRECCION para buscar el registro que acabas de insertar...

1
SELECT idDireccion FROM direccion where direccionDireccion = 'direccionDireccion';

MUCHO OJO: no veo que estés considerando el hecho de que la dirección ya exista en la tabla, por lo tanto deberías de tener una restricción tipo UNIQUE si no quieres tener problemas.

Una vez que obtienes este valor entonces puedes proceder a insertar tu EMPLEADO, asignándole la clave que acabas de obtener... observa este ejemplo, supongamos que tienes esta información;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT * FROM direccion;
+-------------+--------------------+
| idDireccion | direccionDireccion |
+-------------+--------------------+
|           3 | direccion tres     |
|           6 | direccion seis     |
+-------------+--------------------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM trabajador;
+--------------+------------------+---------------------+
| idTrabajador | nombreTrabajador | direccionTrabajador |
+--------------+------------------+---------------------+
|            1 | uno              |                   3 |
|            2 | dos              |                   3 |
|            3 | tres             |                   6 |
+--------------+------------------+---------------------+
3 rows in set (0.00 sec)

Ahora, supongamos que quieres agregar un nuevo empleado con una nueva dirección... Primero insertas la nueva dirección:

1
2
mysql> INSERT INTO direccion (direccionDireccion) VALUES ('direccion nueva');
QUERY OK, 1 ROW affected (0.08 sec)

Segundo, consultas la tabla para ver qué id fue el que se le asignó:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> set @idDireccion = (SELECT idDireccion
    ->                     FROM direccion
    ->                     WHERE direccionDireccion = 'direccion nueva');
Query OK, 0 rows affected (0.09 sec)
 
mysql> SELECT @idDireccion;
+--------------+
| @idDireccion |
+--------------+
|            8 |
+--------------+
1 row in set (0.00 sec)

MUCHO OJO: Para obtener el id tienes que hacer la consulta, y no utilizar la función MAX(id) + 1, ya que no siempre el ID que se asigna sigue esta regla como en el ejemplo... el id se asigna con un apuntador que guarda la tabla, no con MAX(id) + 1.

Ahora, con ese valor INSERTAS el nuevo registro para el trabajador:

1
2
3
mysql> INSERT INTO trabajador (nombreTrabajador, direccionTrabajador)
    -> VALUES ('trabajador nuevo', @idDireccion);
Query OK, 1 row affected (0.06 sec)

Y puedes verificar que las tablas ahora si están relacionadas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> SELECT * FROM direccion;
+-------------+--------------------+
| idDireccion | direccionDireccion |
+-------------+--------------------+
|           3 | direccion tres     |
|           6 | direccion seis     |
|           8 | direccion nueva    |
+-------------+--------------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM trabajador;
+--------------+------------------+---------------------+
| idTrabajador | nombreTrabajador | direccionTrabajador |
+--------------+------------------+---------------------+
|            1 | uno              |                   3 |
|            2 | dos              |                   3 |
|            3 | tres             |                   6 |
|            4 | trabajador nuevo |                   8 |
+--------------+------------------+---------------------+
4 rows in set (0.00 sec)

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
0
Comentar
sin imagen de perfil

Escribir datos en llave foranea

Publicado por sodro (2 intervenciones) el 11/07/2017 21:48:18
Gracias!
me faltaba cambiar el orden de la ejecucion de mis metodos y agregar un tercero que me permitiese insertar el idDireccion y despues crear los datos a la tabla de trabajador!

PD: el problema no nunca fue JAVA, lo deje en claro para descartar errores
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