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:
- Carga simultánea de múltiples registros desde un fichero de texto.
- 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;
En determinados entornos de UNIX es necesario activar específicamente la opción –local-infile a la hora de invocar al programa mysql. Esta opción, no obstante, está activada por defecto habitualmente en la mayoría de las distribuciones de Linux.
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
Observad que los genes pueden poseer más de una anotación funcional. Por otro lado, la misma función biológica puede ser desempeñada por genes distintos. Pero los dos valores juntos forman una clave única.
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.
Las cadenas de texto deben introducirse utilizando siempre comillas simples, mientras que los valores numéricos no necesitan ningún formato adicional.
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');
En el caso de intentar dar de alta un registro cuya clave primaria ya existe, el sistema nos advertirá del error, abortando dicha operación. Una tabla no puede tener una clave primaria repetida.
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.