1. Bases de datos relacionales

1.5. Creación de tablas y restricciones

Una base de datos está formada por un conjunto de tablas que nos permitirán estructurar la información que percibimos en un escenario concreto del mundo real. Cada tabla almacenará en forma de registros la serie de ejemplos de cada clase de entidades o relaciones entre entidades especificadas previamente. Para crear una tabla de registros vacía con el comando CREATE TABLE es necesario primero declarar sus atributos (consultad la figura 17).

Figura 17. Sintaxis del comando CREATE TABLE.
Los elementos opcionales se muestran entre corchetes.
Fuente: elaboración propia.

A la hora de definir la clase de información que almacenaremos en cada atributo, MySQL proporciona una gran variedad de tipos numéricos y alfanuméricos básicos (tabla 2). El espacio de memoria requerido para almacenar cada variable depende de la precisión especificada en cada caso. Los tipos DATE y TIME resultan especialmente útiles para llevar el registro de nuestras actividades en el tiempo. El usuario puede declarar, además, variables del tipo objeto (en inglés, Binary Large Objects o BLOB) para almacenar ficheros de texto, documentos en formato PDF o incluso imágenes dentro de alguna tabla de la base de datos.

Tabla 2. Tipos de datos en MySQL.

 Tipo genérico  Tipos MySQL
 Entero TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
 Decimal DECIMAL, FLOAT, DOUBLE/REAL
 Texto CHAR, VARCHAR, TINYTEXT, TEXT
 Objetos BLOB, MEDIUMBLOB, LONGBLOB
 Tiempo DATE, TIME

Fuente: elaboración propia.

Junto con la declaración de los atributos, para crear una tabla debemos especificar qué atributo o combinación de atributos será la clave primaria, identificando de forma unívoca cada instancia (figura 18). En caso de existir, las claves foráneas para referenciar a los atributos de otras tablas también deben indicarse explícitamente.

El diseñador puede activar dos controles internos sobre el valor de un atributo en el momento de registrar nuevas instancias en la base de datos. En primer lugar, es posible rechazar aquellos registros que no posean un valor definido para un atributo concreto. Esta circunstancia se especifica con la construcción NOT NULL, justo después de la declaración de tipos. NOT NULL sería una restricción de campo obligatorio, no acepta valores nulos. En caso contrario, el sistema asignará por defecto el valor NULL a ese campo y aceptará valores nulos. Este requerimiento debe satisfacerse inexcusablemente en aquellos atributos que pertenecen a la clave primaria. En segundo lugar, para los identificadores numéricos asociados a cada instancia, el propio sistema puede encargarse de gestionar un contador automático de valores mediante la construcción AUTO_INCREMENT.

Volviendo nuevamente a nuestra base de datos catalogo (figura 16), nos encontramos ahora en disposición de crear las tablas del catálogo de genes especificadas formalmente en las figuras 18, 19, 20 y 21. Debemos escoger adecuadamente los tipos de datos para cada atributo o campo, según su contenido, definiendo claramente cuáles son las claves primarias y foráneas. El usuario puede empezar creando las tablas más elementales, es decir, aquellas que no poseen claves foráneas (genomas y funciones). Observad cómo declaramos la clave primaria y nos aseguramos de que ninguna instancia puede darse de alta en la base de datos con un valor nulo para las claves primarias, especie y función. Para verificar que el proceso de creación ha funcionado correctamente, el usuario puede consultar en la base de datos sobre las tablas existentes con el comando SHOW TABLES.

Figura 18. Crear las tablas genomas y funciones en nuestra base de datos catalogo.
Fuente: elaboración propia.

Es posible revisar la definición de una tabla con la instrucción DESCRIBE:

Figura 19. Muestra de la descripción de una tabla de nuestro catálogo.
Fuente: elaboración propia.

A continuación, para crear la tabla genes, además de la clave primaria, indicamos un campo o atributo que es la clave foránea (que debe apuntar o hacer referencia a la clave primaria de la tabla genomas):

Figura 20. Creación de la tabla genes en nuestra base de datos catalogo.
Fuente: elaboración propia.

Finalmente, creamos la tabla anotaciones para relacionar los genes con las anotaciones funcionales. Junto con los dos valores que identifican cada registro (gen y funcion), añadiremos un atributo para registrar el origen de la información:

Figura 21. Creación de la tabla anotaciones en nuestra base de datos catalogo.
Los dos componentes de la clave primaria de la tabla anotaciones deben declararse como claves foráneas con origen en las tablas genes y funciones.
Fuente: elaboración propia.

Es posible definir otras restricciones a los campos de las tablas con el comando CHECK.

Por ejemplo, podemos indicar que un campo numérico como el campo incio de la tabla genes que es tipo numérico solo acepte valores positivos CHECK (inicio >0), o que un campo de tipo cadena de caracteres solo acepte determinados valores; por ejemplo, para que el campo hebra de la tabla genes solo acepte los caracteres «+» o «-», podemos hacer hebra ENUM(‘+‘,’-‘).

Una vez creada la tabla podemos modificarla con la instrucción ALTER TABLE.

Por ejemplo, si queremos eliminar el campo origen de la tabla anotaciones escribimos

ALTER TABLE anotaciones DROP COLUMN origen;

y si queremos volver a añadir el mismo campo escribimos

ALTER TABLE anotaciones ADD origen VARCHAR(20);

Durante el tiempo de vida de una base de datos es frecuente que debamos actualizar su contenido. En determinados casos, esto puede implicar la eliminación completa de usuarios, de tablas o incluso, de la propia base de datos. Para implementar estos servicios, MySQL posee la familia de comandos DROP.

Figura 22. Sintaxis del comando DROP.
Fuente: elaboración propia.