1. Bases de datos relacionales

1.6. Insertar y manipular datos en las tablas

Una vez el esquema relacional de entidades previamente diseñado está estructurado sobre MySQL mediante tablas, es el momento de dotar de contenido cada tabla.

MySQL dispone de dos formas de insertar nuevos registros en las tablas de la base de datos:

  1. Carga simultánea de múltiples registros desde un fichero de texto.
  2. Inserción individual de cada nuevo registro de forma manual.

Para importar una cantidad elevada de registros es posible utilizar el comando LOAD DATA. Para invocar este comando debemos especificar el nombre del fichero de texto que alberga la información de los registros junto con el nombre de la tabla donde deben ser dados de alta. Es necesario disponer de acceso a un fichero de texto tabulado, donde cada fila representa un nuevo registro y cada columna alberga el valor de un atributo (especificado en el mismo orden que en la tabla).

LOAD DATA LOCAL INFILE fichero.txt INTO TABLE tabla;

Podemos proceder a introducir los primeros datos en nuestro catálogo de genes. Es recomendable empezar por las tablas más elementales, aquellas que no poseen claves foráneas. En nuestro caso, las tablas genoma y funciones se ajustan perfectamente a esta descripción. Por ejemplo, para poblar la tabla genomas editaremos el siguiente fichero, genomas.txt, desde nuestro terminal de UNIX:

D. melanogaster Mosca de la fruta   Tambien denominada del vinagre
H. sapiens      Hombre              Nuestra propia especie
M. musculus     Raton               Otro organismo modelo

Para proceder a la carga de estos datos en la tabla genomas, el usuario debe introducir el siguiente comando desde el intérprete de MySQL:

mysql> LOAD DATA LOCAL INFILE 'genomas.txt' INTO TABLE genomas;

Query OK, 3 rows affected (0,08 sec)
Records:  3  Deleted:  0  Skipped:  0  Warnings:  0

Presentamos el contenido del fichero funciones.txt, que emplearemos para poblar la tabla funciones con tres nuevos registros:

GO:0003700         Factor de transcripcion
GO:0006338         Remodelado de cromatina
GO:0007254         Via JNK

Ahora empleamos el fichero funciones.txt para poblar la correspondiente tabla:

mysql> LOAD DATA LOCAL INFILE 'funciones.txt' INTO TABLE funciones;
Query OK,  3 rows affected (0,01 sec)
Records:  3  Deleted:  0  Skipped:  0  Warnings:  0

Una vez hemos poblado las tablas genomas y funciones con varias instancias de especies y funciones biológicas, respectivamente, es el momento de editar el fichero genes.txt para dar de alta nuevos genes en la tabla genes:

MYC   chr8  + 128748314 128753678 NP_002458 H.sapiens
HNF1A chr12 + 121416548 121440312 NP_000536 H.sapiens
cbt   chr2L –    476437    479046 NP_722636 D.melanogaster
ash2  chr3R +. 20477248  20479098 NP_733023 D.melanogaster

Y ahora procedemos a realizar la carga con el comando LOAD DATA:

mysql> LOAD DATA LOCAL INFILE 'gens.txt' INTO TABLE gens;

Query OK,  4 rows affected (0,02 sec)
Records:  4  Deleted:  0  Skipped:  0  Warnings:  0

Antes de proceder a realizar las primeras consultas, editaremos el fichero de texto anotaciones.txt para asignar funciones a los genes que hemos registrado en los comandos previos.

MYC    GO:0003700  Experimental
MYC    GO:0006338  Literatura
HNF1A  GO:0003700  Experimental
cbt    GO:0003700  Experimental
cbt    GO:0007254  Experimental
ash2   GO:0006338  Experimental
ash2   GO:0003700  Computacional

Estamos en condiciones de poblar nuestra última tabla anotaciones:

mysql> LOAD DATA LOCAL INFILE 'anotaciones.txt'
    -> INTO TABLE anotaciones;

Query OK,  7 rows affected (0,08 sec)
Records:  7  Deleted:  0  Skipped:  0  Warnings:  0

La carga de datos desde un fichero de texto en las tablas es extremadamente útil. No obstante, en determinados casos necesitamos dar de alta un nuevo registro de forma aislada, pero la edición de un fichero de texto únicamente con este objetivo es menos eficiente.

En estos casos, el comando INSERT es más adecuado, dado que implementa esta funcionalidad en el gestor MySQL de bases de datos. El usuario debe especificar en el mismo orden tanto la lista de atributos del nuevo registro como sus correspondientes valores. El resto de atributos no incluidos en la relación anterior tomarán el valor NULL (excepto para aquellos donde está expresamente prohibida esta circunstancia durante la creación de la tabla, campos obligatorios):

INSERT INTO tabla (campo1, campo2,...,campoN)
VALUES (valor1,valor2,...,valorN);

Por regla general, sin embargo, un registro contiene todos los campos declarados para una tabla. Por tanto, respetando el orden de los campos en la tabla, podemos omitir la relación completa de los atributos:

INSERT INTO tabla
VALUES (valor1,valor2,...,valorN);

A modo de ejemplo, mostramos a continuación la secuencia de comandos de inserción equivalente a la carga simultánea de las funciones ejecutada anteriormente.

mysql> INSERT INTO funciones
    -> VALUES ('GO:0003700',
    ->         'Factor de transcripcion');

mysql> INSERT INTO funciones
    -> VALUES ('GO:0006338',
    ->         'Remodelado de cromatina');

mysql> INSERT INTO funciones
    -> VALUES ('GO:0007254',
    ->         'Via JNK');

Una vez tenemos los datos introducidos en las tablas podemos modificarlos con la instrucción UPDATE o eliminar registros con la instrucción DELETE.

Por ejemplo, si queremos modificar el valor ‘Factor de transcripción situado en el campo descripcion del registro o fila con clave primaria ‘GO:0003700’ de la tabla funciones, y queremos que el nuevo valor sea ‘Transcription factor‘ escribiremos la instrucción siguiente:

UPDATE funciones
SET descripcion ='Transcription factor'
WHERE funcion = 'GO:0003700';

Para eliminar únicamente algunos registros de una determinada tabla podemos utilizar el comando DELETE junto con la cláusula WHERE. De este modo, seleccionaremos con precisión los registros que deben ser dados de baja.

Si el usuario desea eliminar todos los registros de una tabla, conservando la estructura de esta (para reutilizarla en el futuro), basta con omitir la condición:

DELETE FROM tabla WHERE condiciones;
DELETE FROM tabla;

Si queremos eliminar el registro de la tabla funciones con clave primaria ‘GO:0007254‘ escribiremos la instrucción siguiente:

DELETE FROM funciones WHERE funcion = 'GO:0007254';

Si intentamos eliminar un registro que está referenciado por una clave foránea de otra tabla, el sistema lo impedirá y saltará un error, a no ser que a la clave foránea le indiquemos la opción ON DELETE CASCADE, que permite eliminar en cascada el registro que deseamos eliminar y los registros de la otra tabla que están referenciados.