mysql

Agregar columna llave foránea (fk) en MySQL

Resumen: en este post te muestro cómo modificar o alterar una tabla de MySQL para agregar una columna y hacer que esa columna sea una clave foránea.

Las relaciones en MySQL son importantes para tener datos en distintas tablas y no caer en la redundancia de campos. En ocasiones vamos a necesitar agregar una clave foránea a una tabla ya existente.

Agregar foreign key a tabla de MySQL

La sintaxis es:

ALTER TABLE tu_tabla
    ADD COLUMN [definición de columna],
    ADD CONSTRAINT `fk_relacion` FOREIGN KEY (columna_recién_creada)
        REFERENCES la_otra_tabla(columnaEnLaOtraTabla);

Ejemplo para agregar columna

Tengo una tabla de ventas que es así:

MariaDB [ventas]> describe ventas;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| idPaciente | int(11)             | NO   | MUL | NULL    |                |
| fecha      | datetime            | NO   |     | NULL    |                |
| total      | decimal(7,2)        | YES  |     | NULL    |                |
| vista      | tinyint(1)          | NO   |     | 0       |                |
| idUsuario  | bigint(20) unsigned | NO   |     | NULL    |                |
| estado     | int(11)             | NO   |     | 0       |                |
+------------+---------------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

Quiero agregarle una columna que guarde relación con otra tabla llamada médicos. Primero debo averiguar cómo es la tabla de médicos, es así:

MariaDB [ventas]> describe medicos;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| id           | int(200)    | NO   | PRI | NULL    | auto_increment |
| Nombre       | text        | NO   |     | NULL    |                |
| Cedula       | varchar(10) | NO   |     | NULL    |                |
| Especialidad | text        | NO   |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

Es importante tener la definición de la columna, en este caso es un int de 200 que no es null. Para agregar la relación, la consulta es:

ALTER TABLE ventas
    ADD COLUMN idMedico int(200) NOT NULL default 1,
    ADD CONSTRAINT `fk_id_medico` FOREIGN KEY (idMedico)
        REFERENCES medicos (id);

Ya que agrego la columna idMedico a la tabla ventas, la definición de la columna debe ser la misma que la de la otra tabla a la que relaciono.

Debo colocar un valor default y ese valor debe existir en la tabla médicos (es decir, un médico debe tener el id 1 y debe existir)

Después fk_id_medico es el nombre del constraint, y en foreign key indico que la columna idMedico es mi llave foránea que referencia a la columna id en medicos.

Cuando ejecuto esa consulta, la columna se agrega correctamente:

MariaDB [ventas]> describe ventas;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| idPaciente | int(11)             | NO   | MUL | NULL    |                |
| fecha      | datetime            | NO   |     | NULL    |                |
| total      | decimal(7,2)        | YES  |     | NULL    |                |
| vista      | tinyint(1)          | NO   |     | 0       |                |
| idUsuario  | bigint(20) unsigned | NO   |     | NULL    |                |
| estado     | int(11)             | NO   |     | 0       |                |
| idMedico   | int(200)            | NO   | MUL | 1       |                |
+------------+---------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

Ahora solo basta hacer un update o revisar toda la tabla pues todos los valores de idMedico son 1, es mejor actualizarlo o crear un valor general como “médico general” en este caso, y así las ventas que no tenían médico se registran con uno por defecto; las siguientes ya tendrán uno específico.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Servidor HTTP en Android con Flutter

El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…

4 días hace

Imprimir automáticamente todos los PDF de una carpeta

En este post te voy a enseñar a designar una carpeta para imprimir todos los…

5 días hace

Guía para imprimir en plugin versión 1 desde Android

En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…

1 semana hace

Añadir tasa de cambio en sistema de información

Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…

2 semanas hace

Comprobar validez de licencia de plugin ESC POS

Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…

2 semanas hace

Imprimir euro € en impresora térmica

Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…

4 semanas hace

Esta web usa cookies.