1. Bases de dades relacionals

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:

  1. Càrrega simultània de múltiples registres des d’un fitxer de text.
  2. 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;

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

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.

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');

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.