MySQL - Llaves primarias y foraneas

 
Vista:
Imágen de perfil de adliH
Val: 4
Ha aumentado su posición en 10 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Llaves primarias y foraneas

Publicado por adliH (2 intervenciones) el 04/07/2018 23:17:41
Buenas tardes, necesito ayuda
Pregunto una llave primaria puede ser a la vez foranea en la misma tabla?

Ademas de eso; si tengo dos llaves primarias en la misma tabla y quiero hacer una relacion muchos a muchos (varias cuentas de banco que pertenezcan a varias personas a la vez)eso ¿se puede? porque tengo dos horas tratando de hacerlo y me da error porque obviamente no puedo repetir registros que puedo hacer en este caso?
Saludos
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

Llaves primarias y foraneas

Publicado por leonardo_josue (414 intervenciones) el 05/07/2018 16:42:34
Hola adliH:

Vayamos por partes:

1
Pregunto una llave primaria puede ser a la vez foranea en la misma tabla?

Dependerá de qué versión estés utilizando de MySQL... hasta donde recuerdo, las llaves recursivas o cíclicas se soportan a partir de la versión 5.5.

El ejemplo típico de lo que planteas es una tabla de empleados con un id_empleado y un id_jefe, en donde el JEFE es a su vez un empleado de la empresa, entonces se haría más o menos así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> CREATE TABLE empleados (
    ->   id_empleado INT NOT NULL,
    ->   id_empleado_jefe INT NULL,
    ->   nombre_empleado VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.19 sec)
 
mysql> ALTER TABLE empleados
    -> ADD CONSTRAINT PRIMARY KEY (id_empleado);
Query OK, 0 rows affected (0.47 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> ALTER TABLE empleados
    -> ADD CONSTRAINT FOREIGN KEY (id_empleado_jefe) REFERENCES empleados (id_empleado)
    -> ON UPDATE CASCADE ON DELETE CASCADE;
 
Query OK, 0 rows affected (0.58 sec)
Records: 0  Duplicates: 0  Warnings: 0

entonces, el campo id_empleado es LLAVE PRIMARIA y el campo id_empleado_jefe ES UNA LLAVE FORÁNEA QUE APUNTA HACIA LA MISMA TABLA. Es recomendable que la llave foránea la definas que acepte nulos, porque en teoría habrá al menos un JEFE que no tenga JEFE (es decir, el rango más alto de la empresa) aunque también podrías definir que en este caso JEFE del JEFE es el mismo JEFE O_o.

Con esto, entonces puedes agregar los registros así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> INSERT INTO empleados VALUES
    -> (1, null, 'jefe 1'),
    -> (2, null, 'jefe 2'),
    -> (3, 1, 'empleado 1.1'),
    -> (4, 1, 'empleado 1.2'),
    -> (5, 2, 'empleado 2.1');
Query OK, 5 rows affected (0.08 sec)
Records: 5  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM empleados;
+-------------+------------------+-----------------+
| id_empleado | id_empleado_jefe | nombre_empleado |
+-------------+------------------+-----------------+
|           1 |             NULL | jefe 1          |
|           2 |             NULL | jefe 2          |
|           3 |                1 | empleado 1.1    |
|           4 |                1 | empleado 1.2    |
|           5 |                2 | empleado 2.1    |
+-------------+------------------+-----------------+
5 rows in set (0.00 sec)

Pero si intentas registrar un JEFE que no exista en la tabla, entonces marcaría error de integridad:

1
2
3
mysql> INSERT INTO empleados VALUES (6, 7, 'empleado 3.1');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`pruebas`.`empleados`, CONSTRAINT `empleados_ibfk_1` FOREIGN KEY (`id_empleado_jefe`) REFERENCES `empleados` (`id_empleado`))
mysql> SELECT * FROM empleados;

¿se entiende?

Ahora, para el otro punto:

1
2
3
Ademas de eso; si tengo dos llaves primarias en la misma tabla y quiero hacer una relacion muchos a muchos (varias
cuentas de banco que pertenezcan a varias personas a la vez)eso ¿se puede? porque tengo dos horas tratando de hacerlo
y me da error porque obviamente no puedo repetir registros que puedo hacer en este caso?

Dices que te da error, pero no nos dices cuál es ese error ni tampoco nos pones el código que haz intentado hacer. Lamentablemente en el foro no hay adivinos, así es que resulta complicado ayudarte en este punto. Por reglas del model E-R, una relación muchos a muchos siempre se modela con tres tablas: 2 tablas "catálogos" en tu caso un catálogo de cuentas y un catálogo de personas, y una tabla de relaciones entre ambas tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
mysql> SELECT * FROM personas;
+------------+----------------+
| id_persona | nombre_persona |
+------------+----------------+
|          1 | persona 1      |
|          2 | persona 2      |
|          3 | persona 3      |
+------------+----------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM cuentas;
+-----------+---------------+
| id_cuenta | nombre_cuenta |
+-----------+---------------+
|         1 | cuenta 1      |
|         2 | cuenta 2      |
|         3 | cuenta 3      |
+-----------+---------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM personas_cuentas;
+-------------------+------------+-----------+
| id_persona_cuenta | id_persona | id_cuenta |
+-------------------+------------+-----------+
|                 1 |          1 |         1 |
|                 2 |          1 |         2 |
|                 3 |          1 |         3 |
|                 4 |          2 |         2 |
|                 5 |          2 |         3 |
|                 6 |          3 |         3 |
+-------------------+------------+-----------+
6 rows in set (0.00 sec)

Entonces, aquí guardas todas las relaciones que existan entre personas y cuentas, es decir, una cuenta puede pertenecer a más de una persona y a la vez una persona puede tener más de una cuenta.

Si esto no te sirve, trata de ser más clara con tu problema, postea lo que sea que intentaste hacer y dinos los códigos de error que estás obteniendo, así será más factible que podamos ayudarte.

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
2
Comentar
Imágen de perfil de adliH
Val: 4
Ha aumentado su posición en 10 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Llaves primarias y foraneas

Publicado por adliH (2 intervenciones) el 06/07/2018 01:00:43
Muchas gracias, disculpa, de hecho tienes razon mi pregunta carecio de un buen planteamiento y no estaba ilustrada pero me sirvio de mucho tu respuesta ya pude terminar mi ejercicio
Es la primera vez que hago una pregunta aqui y no sabia como funcionaba en realidad.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