1.6. Inserir i manipular dades a les taules
Un cop l’esquema relacional d’entitats prèviament dissenyat està estructurat sobre MySQL mitjançant taules, és el moment de dotar de contingut cada taula.
MySQL disposa de dues formes d’inserir nous registres a les taules de la base de dades:
- Càrrega simultània de múltiples registres des d’un fitxer de text.
- Inserció individual de cada nou registre de forma manual.
Per importar una quantitat elevada de registres és possible utilitzar l’ordre LOAD DATA. Per invocar aquesta ordre hem d’especificar el nom del fitxer de text que alberga la informació dels registres juntament amb el nom de la taula on han de ser donats d’alta. Cal disposar d’accés a un fitxer de text tabulat, on cada fila representa un nou registre i cada columna alberga el valor d’un atribut (especificat en el mateix ordre que a la taula).
LOAD DATA LOCAL INFILE fitxer.txt INTO TABLE taula;
En determinats entorns d’UNIX cal activar específicament l’opció –local-infile a l’hora d’invocar el programa mysql. Aquesta opció, no obstant, està activada per defecte habitualment en la majoria de distribucions de Linux.
Podem procedir a introduir les primeres dades en el nostre catàleg de gens. És recomanable començar per les taules més elementals, aquelles que no posseeixen claus foranes. En el nostre cas, les taules genomes i funcions s’ajusten perfectament a aquesta descripció. Per exemple, per poblar la taula genomes editarem el següent fitxer, genomes.txt, des del nostre terminal d’UNIX:
D. melanogaster Mosca de la fruita Tambe anomenada del vinagre H. sapiens Home La nostra propia especie M. musculus Ratoli Un altre organisme model
Per procedir a la càrrega d’aquestes dades a la taula genomes, l’usuari ha d’introduir la següent ordre des de l’intèrpret de MySQL:
mysql> LOAD DATA LOCAL INFILE 'genomes.txt' INTO TABLE genomes; Query OK, 3 rows affected (0,08 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
Presentem el contingut del fitxer funcions.txt, que emprarem per poblar la taula funcions amb tres nous registres:
GO:0003700 Factor de transcripcio GO:0006338 Remodelatge de cromatina GO:0007254 Via JNK
Ara emprem el fitxer funcions.txt per poblar la corresponent taula:
mysql> LOAD DATA LOCAL INFILE 'funcions.txt' INTO TABLE funcions; Query OK, 3 rows affected (0,01 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
Un cop hem poblat les taules genomes i funcions amb diverses instàncies d’espècies i funcions biològiques, respectivament, és el moment d’editar el fitxer gens.txt per donar d’alta nous gens a la taula gens:
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
I ara procedim a realitzar la càrrega amb l’ordre 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
Abans de procedir a realitzar les primeres consultes, editarem el fitxer de text anotacions.txt per assignar funcions als gens que hem registrat en les ordres prèvies.
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
Observeu que els gens poden posseir més d’una anotació funcional. D’altra banda, la mateixa funció biològica pot ser exercida per gens diferents. Però els dos valors junts formen una clau única.
Estem en condicions de poblar la nostra última taula, anotacions:
mysql> LOAD DATA LOCAL INFILE 'anotacions.txt' -> INTO TABLE anotacions; Query OK, 7 rows affected (0,08 sec) Records: 7 Deleted: 0 Skipped: 0 Warnings: 0
La càrrega de dades des d’un fitxer de text a les taules és extremadament útil. No obstant això, en determinats casos necessitem donar d’alta un nou registre de forma aïllada, però l’edició d’un fitxer de text únicament amb aquest objectiu és menys eficient.
En aquests casos, l’ordre INSERT
és més adequada, atès que implementa aquesta funcionalitat en el gestor MySQL de bases de dades. L’usuari ha d’especificar en el mateix ordre tant la llista d’atributs del nou registre com els seus corresponents valors. La resta d’atributs no inclosos en la relació anterior prendran el valor NULL
(excepte per a aquells on està expressament prohibida aquesta circumstància durant la creació de la taula, camps obligatoris):
INSERT INTO taula (camp1, camp2,...,campN) VALUES (valor1,valor2,...,valorN);
Per regla general, però, un registre conté tots els camps declarats per a una taula. Per tant, respectant l’ordre dels camps a la taula, podem ometre la relació completa dels atributs:
INSERT INTO taula VALUES (valor1,valor2,...,valorN);
A tall d’exemple, mostrem a continuació la seqüència d’ordres d’inserció equivalent a la càrrega simultània de les funcions executada anteriorment.
Las cadenes de text s’han d’introduir utilitzant sempre cometes simples, mentre que els valors numèrics no necessiten cap format addicional.
mysql> INSERT INTO funcions -> VALUES ('GO:0003700', -> 'Factor de transcripcio'); mysql> INSERT INTO funcions -> VALUES ('GO:0006338', -> 'Remodelatge de cromatina'); mysql> INSERT INTO funcions -> VALUES ('GO:0007254', -> 'Via JNK');
En el cas d’intentar donar d’alta un registre la clau primària del qual ja existeix, el sistema ens advertirà de l’error, avortant aquesta operació. Una taula no pot tenir una clau primària repetida
Un cop tenim les dades introduïdes a les taules podem modificar-les amb la instrucció UPDATE
o eliminar registres amb la instrucció DELETE
.
Per exemple, si volem modificar el valor «Factor de transcripció», situat en el camp del registre o fila amb clau primària GO:0003700 de la taula, i volem que el nou valor sigui «Transcription factor», escriurem la instrucció següent:
UPDATE funcions SET descripcion ='Transcription factor' WHERE funcion = 'GO:0003700';
Per eliminar únicament alguns registres d’una determinada taula podem utilitzar l’ordre DELETE
juntament amb la clàusula WHERE
. D’aquesta manera, seleccionarem amb precisió els registres que han de ser donats de baixa.
Si l’usuari desitja eliminar tots els registres d’una taula, conservant l’estructura d’aquesta (per reutilitzar-la en el futur), n’hi ha prou amb ometre la condició:
DELETE FROM taula WHERE condicions; DELETE FROM taula;
Si volem eliminar el registre de la taula funcions amb clau primària GO:0007254 escriurem la instrucció següent:
DELETE FROM funcions WHERE funcion = 'GO:0007254';
Si intentem eliminar un registre que està referenciat per una clau forana d’una altra taula el sistema ho impedirà i saltarà un error, tret que a la clau forana li indiquem l’opció ON DELETE CASCADE, que permet eliminar en cascada el registre que desitgem eliminar i els registres de l’altra taula que estan referenciats.