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.
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);
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.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios
era justo lo que necesitaba, muchísimas gracias