Lenguaje de Definición de Datos DDL

Introducción

Sencillo lenguaje artificial para definir y describir los objetos de la base de datos, su estructura, relaciones y restricciones. En la práctica puede consistir en un subconjunto de instrucciones de otro lenguaje informático. Aparte suele poseer dos subconjuntos de instrucciones:

Lenguaje de definición del almacenamiento de los datos (DSDL: Data Storage Definition Language): permite especificar características físicas de la base de datos (volúmenes y archivos donde van a ser almacenados los datos, etc).

Lenguaje de control de datos (DCL: Data Control Language): encargado del control y seguridad de los datos (privilegios y modos de acceso, etc).

Creación de bases de datos

Lo primero que siempre se precisa es crear una base de datos. En esa base de datos es donde se crearán las tablas que vayan a utilizarse. Para ello, se usará la sentencia CREATE DATABASE seguida del nombre que se vaya a utilizar.

Importante

En MySQL no es posible editar el nombre de una base de datos creada, por lo que siempre habrá que tener esto en cuenta.

También hay que saber que no es recomendable utilizar nombres de base de datos con caracteres especiales. Deben eliminarse acentos, espacios y demás. Lo ideal son nombres en minúsculas con las palabras separadas por guiones bajos.

Dado que  editar el nombre de una base de datos no es posible; solo es posible eliminarla. Para ello, se utilizaría DROP DATABASE.

Borrar bases de datos es una tarea muy arriesgada y hay que pensarlo dos veces antes de hacerlo porque no se pide confirmación y no hay vuelta atrás una vez se efectúa.

Las bases de datos no tienen propiedades por sí solas, solamente un nombre.

En MySQL sí tienen algunas propiedades extra como la colación por defecto (la manera de gestionar acentos y caracteres especiales) pero eso no pertenece al estándar y son características avanzadas del sistema.

Una vez creada la base de datos, hay que indicar al sistema que quiere usarse. Esto quiere decir que el SGBD sabrá que cuando se creen tablas o se realicen consultas, la base de datos a utilizar será esa. Para ello, se utilizará la sentencia USE (solo para MySQL).

USE hace que la base de datos actual sea la que se indique. A partir de ese momento MySQL asumirá que esa es la base de datos a utilizar.

Creación de tablas mediante SQL

Para crear tablas, se utilizará la siguiente sintaxis:

Este es el primer ejemplo sobre cómo crear una tabla. Los requisitos que se buscan son estos:

Nombre de la tabla. En este caso “producto”. No debe tener espacios ni caracteres extraños. En caso de tenerlos, se debería encerrar el nombre entre comillas invertidas producto.

Cada nombre de columna separado por comas. La misma restricción de nombres se aplica. No deben tener caracteres extraños.

Para cada columna, su tipo de dato, longitud (si se aplica), sus restricciones de integridad y su valor por defecto (opcional).

Observaciones a la hora de crear una tabla:

  • Siempre debe haber una clave primaria. Es posible crear una tabla sin clave primaria y MySQL no dará ningún error, pero debe haberla. En este caso se especificará que “id” es la clave primaria, añadiendo las palabras “PRIMARY KEY” al final de la definición del campo.
  • Algunos tipos de datos requieren que se especifique su longitud y otros no. Si un campo lo necesita y no se especifica, se recibirá un error.
  • En algunos SGBD los campos por defecto admiten nulos y en otros no. En MySQL los campos por defecto admiten nulos. Si se quiere evitar que esto ocurra habrá que especificar que la columna es NOT NULL. Siempre que sea posible hay que elegir NOT NULL porque es más eficiente. Hay que utilizar los campos nullables solo cuando hagan falta. Para campos NOT NULL es conveniente añadir un valor por defecto para las nuevas filas. Así se evitan posibles errores al insertar datos después. Un campo nullable es aquel que admite nulos.
  • El valor por defecto de un campo debe ser del mismo tipo de dato que el propio campo. Especificar DEFAULT NULL en un campo nullable sería redundante y no tendría sentido. Especificar DEFAULT NULL en un campo NOT NULL daría error y no podría crearse la tabla. Solo es posible especificar valores por defecto simples (números, texto o NULL). No se pueden utilizar funciones especiales. Tan solo hay una excepción para los campos de tipo timestamp, que admiten el valor CURRENT_TIMESTAMP, el cual contiene la fecha y hora en el momento de insertar el dato (útil para tener un campo con el dato de la fecha de creación de algo).

Al crear campos de tipo timestamp es posible utilizar la variable CURRENT_TIMESTAMP para los campos. Los campos timestamp tienen una gran cantidad de restricciones en MySQL, las cuales conviene conocer. Para ello primero se mostrará un ejemplo:

En esta tabla se quiere mantener un registro de la fecha de creación del registro, fecha de modificación y fecha de borrado (se supone que cuando el campo está a NULL es porque no se ha borrado aún).

Solo es posible tener una columna de tipo TIMESTAMP que utilice CURRENT_TIMESTAMP. Las demás deben tener un valor por defecto.

Dado que la fecha de alta no admite nulos porque siempre debe tener un valor, debe especificarse un valor por defecto. Lo ideal es 0000-00-00 00:00:00 que significa que la fecha está vacía.

Además de permitir especificar CURRENT _TIMESTAMP como el valor por defecto, MySQL proporciona un método extra llamado ON UPDATE CURRENT_ TIMESTAMP que hará que el campo actualice su valor a la fecha actual cada vez que el registro en cuestión reciba una modificación.

Modificar tablas

Es muy habitual tener que realizar cambios en tablas ya creadas. No siempre los requerimientos finales de las aplicaciones serán los mismos, por lo que hay que estar preparados para hacer cambios en la estructura de las tablas para amoldarse a la situación.

Para modificar tablas se utiliza la sentencia ALTER TABLE. Tiene un funcionamiento bastante similar a CREATE TABLE, aunque dominarlo es bastante más complejo porque hay más palabras clave a memorizar.

Añadir campos a una tabla

Para crear un campo en una tabla, se utiliza ALTER TABLE ADD COLUMN. Puede probarse creando un campo llamado “categoría” en la tabla de noticias:

Se empieza con ALTER TABLE seguido del nombre de la tabla a modificar. A continuación, se especifica la operación que se quiere realizar, en este caso se desea añadir una columna, así que se usa ADD COLUMN. Después se pone el nombre del nuevo campo y su tipo, de igual manera que si se estuviera creando la tabla, con la misma sintaxis. Al final se tiene una opción que sirve para posicionar la columna en un lugar concreto. En el modelo relacional se decía que el orden de las columnas era irrelevante, pero es cierto que el orden sirve a la hora de gestionar la base de datos para verlo todo más ordenado.

Si se quiere especificar un orden, al final de la definición del campo se añade AFTER seguido del nombre de columna que debe ir delante. Esta columna debe existir, de lo contrario se obtendría error. Si no se especifica nada, el campo se añade al final de la tabla. No es posible utilizar la palabra BEFORE, solo se puede utilizar AFTER. Como se ha indicado, es opcional.

Modificar una columna existente

Para modificar una columna se utiliza ALTER TABLE MODIFY COLUMN. Se probará modificando el campo “categoría” que se acaba de crear para hacer que solo tenga 50 caracteres y no admita nulos:

a sintaxis es igual que para crear una columna pero cambiando ADD por MODIFY. Es importante que la columna exista en la tabla. Puede utilizarse la palabra AFTER también si se quiere mover la columna de posición. Si no se especifica nada, la columna sigue en su posición original.

Eliminar una columna

Para eliminar una columna se utiliza ALTER TABLE DROP COLUMN. Se eliminará la columna “categoría”:

Aquí simplemente se usa DROP COLUMN sin parámetros extra.

Renombrar una columna

Es raro tener que cambiarle el nombre a una columna, pero es posible. Puede ser útil si se produce una equivocación al crearla y quiere rectificarse rápidamente. Para eso se utiliza la palabra CHANGE. Es igual que MODIFY COLUMN, pero permite especificar un nuevo nombre tras el original. Se cambiará el nombre de la columna “precio” de la tabla “pieza” para que sea “precio_neto”: