A nivel teórico, existen dos lenguajes para el manejo de bases de datos:
DDL (Data Definition Language) Lenguaje de definición de datos. Es el lenguaje que se usa
para crear bases de datos y tablas, y para modificar sus estructuras, así como los permisos y
privilegios.
Este lenguaje trabaja sobre unas tablas especiales llamadas
diccionario de datos.
DML (Data Manipilation Language) lenguaje de manipulación de datos. Es el que se usa para modificar
y obtener datos desde las bases de datos.
SQL engloba ambos lenguajes DDL+DML, y los estudiaremos juntos, ya que ambos forman parte del
conjunto de sentencias de SQL.
En este capítulo vamos a explicar el proceso para pasar del modelo lógico relacional, en forma
de esquemas de relaciones, al modelo físico, usando sentencias SQL, y viendo las peculiaridades
específicas de
MySQL.
Crear una base de datos
Cada conjunto de relaciones que componen un modelo completo forma una base de datos. Desde el punto
de vista de SQL, una base de datos es sólo un conjunto de relaciones (o tablas), y para organizarlas
o distinguirlas se accede a ellas mediante su nombre. A nivel de sistema operativo, cada base de
datos se guarda en un directorio diferente.
Debido a esto, crear una base de datos es una tarea muy simple. Claro que, en el momento de crearla,
la base de datos estará vacía, es decir, no contendrá ninguna tabla.
Vamos a crear y manipular nuestra propia base de datos, al tiempo que nos familiarizamos con la
forma de trabajar de
MySQL.
Para empezar, crearemos una base de datos para nosotros solos, y la llamaremos "prueba". Para crear
una base de datos se usa una sentencia
CREATE DATABASE:
mysql> CREATE DATABASE prueba;
Query OK, 1 row affected (0.03 sec)
mysql>
Podemos averiguar cuántas bases de datos existen en nuestro sistema usando la sentencia
SHOW DATABASES:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| mysql |
| prueba |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql>
A partir de ahora, en los próximos capítulos, trabajaremos con esta base de datos, por lo
tanto la seleccionaremos como base de datos por defecto. Esto nos permitirá obviar
el nombre de la base de datos en consultas. Para seleccionar una base de datos
se usa el comando
USE, que no es exactamente una sentencia SQL, sino más bien de
una opción de
MySQL:
mysql> USE prueba;
Database changed
mysql>
Crear una tabla
Veamos ahora la sentencia
CREATE TABLE que sirve para crear tablas.
La sintaxis de esta sentencia es muy compleja, ya que existen muchas opciones y tenemos muchas
posibilidades diferentes a la hora de crear una tabla. Las iremos viendo paso a paso, y en poco
tiempo sabremos usar muchas de sus posibilidades.
En su forma más simple, la sentencia
CREATE TABLE creará una tabla con las
columnas que indiquemos. Crearemos, como ejemplo, una tabla que nos permitirá almacenar nombres de
personas y sus fechas de nacimiento. Deberemos indicar el nombre de la tabla y los nombres
y tipos de las columnas:
mysql> USE prueba
Database changed
mysql> CREATE TABLE gente (nombre VARCHAR(40), fecha DATE);
Query OK, 0 rows affected (0.53 sec)
mysql>
Hemos creado una tabla llamada "gente" con dos columnas: "nombre" que puede contener cadenas
de hasta 40 caracteres y "fecha" de tipo fecha.
Podemos consultar cuántas tablas y qué nombres tienen en una base de datos, usando la sentencia
SHOW TABLES:
mysql> SHOW TABLES;
+------------------+
| Tables_in_prueba |
+------------------+
| gente |
+------------------+
1 row in set (0.01 sec)
mysql>
Pero tenemos muchas más opciones a la hora de definir columnas. Además del tipo y el nombre, podemos
definir valores por defecto, permitir o no que contengan valores nulos, crear una clave primaria,
indexar...
La sintaxis para definir columnas es:
nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto]
[AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string']
[definición_referencia]
Veamos cada una de las opciones por separado.
Valores nulos
Al definir cada columna podemos decidir si podrá o no contener valores nulos.
Debemos recordar que, como vimos en los capítulos de modelado, aquellas columnas que son o forman
parte de una clave primaria no pueden contener valores nulos.
Veremos que, si definimos una columna como clave primaria, automáticamente se impide que pueda
contener valores nulos, pero este no es el único caso en que puede ser interesante impedir la
asignación de valores nulos para una columna.
La opción por defecto es que se permitan valores nulos,
NULL, y para que no se permitan, se
usa
NOT NULL. Por ejemplo:
mysql> CREATE TABLE ciudad1 (nombre CHAR(20) NOT NULL, poblacion INT NULL);
Query OK, 0 rows affected (0.98 sec)
Valores por defecto
Para cada columna también se puede definir, opcionalmente, un valor por defecto. El valor por defecto
se asignará de forma automática a una columna cuando no se especifique un valor determinado al añadir
filas.
Si una columna puede tener un valor nulo, y no se especifica un valor por defecto, se usará NULL como
valor por defecto. En el ejemplo anterior, el valor por defecto para
poblacion es NULL.
Por ejemplo, si queremos que el valor por defecto para
poblacion sea 5000, podemos crear la
tabla como:
mysql> CREATE TABLE ciudad2 (nombre CHAR(20) NOT NULL,
-> poblacion INT NULL DEFAULT 5000);
Query OK, 0 rows affected (0.09 sec)
Claves primarias
También se puede definir una clave primaria sobre una columna, usando la palabra clave
KEY o
PRIMARY KEY.
Sólo puede existir una clave primaria en cada tabla, y la columna sobre la que se define una clave
primaria no puede tener valores
NULL. Si esto no se especifica de forma explícita,
MySQL lo
hará de forma automática.
Por ejemplo, si queremos crear un índice en la columna
nombre de la tabla de ciudades,
crearemos la tabla así:
mysql> CREATE TABLE ciudad3 (nombre CHAR(20) NOT NULL PRIMARY KEY,
-> poblacion INT NULL DEFAULT 5000);
Query OK, 0 rows affected (0.20 sec)
Usar
NOT NULL PRIMARY KEY equivale a
PRIMARY KEY,
NOT NULL KEY o sencillamente
KEY. Personalmente, prefiero usar la primera forma o la segunda.
Existe una sintaxis alternativa para crear claves primarias, que en general es preferible, ya que
es más potente. De hecho, la que hemos explicado es un alias para la forma general, que no admite
todas las funciones (como por ejemplo, crear claves primarias sobre varias columnas). Veremos esta
otra alternativa un poco más abajo.
Columnas autoincrementadas
En
MySQL tenemos la posibilidad de crear una columna autoincrementada, aunque esta columna
sólo puede ser de tipo entero.
Si al insertar una fila se omite el valor de la columna autoinrementada o si se inserta un valor
nulo para esa columna, su valor se calcula automáticamente, tomando el valor más alto de esa columna
y sumándole una unidad. Esto permite crear, de una forma sencilla, una columna con un valor único
para cada fila de la tabla.
Generalmente, estas columnas se usan como claves primarias 'artificiales'.
MySQL está
optimizado para usar valores enteros como claves primarias, de modo que la combinación de clave
primaria, que sea entera y autoincrementada es ideal para usarla como clave primaria artificial:
mysql> CREATE TABLE ciudad5 (clave INT AUTO_INCREMENT PRIMARY KEY,
-> nombre CHAR(20) NOT NULL,
-> poblacion INT NULL DEFAULT 5000);
Query OK, 0 rows affected (0.11 sec)
mysql>
Comentarios
Adicionalmente, al crear la tabla, podemos añadir un comentario a cada columna. Este comentario sirve
como información adicional sobre alguna característica especial de la columna, y entra en el apartado
de documentación de la base de datos:
mysql> CREATE TABLE ciudad6
-> (clave INT AUTO_INCREMENT PRIMARY KEY COMMENT 'Clave principal',
-> nombre CHAR(50) NOT NULL,
-> poblacion INT NULL DEFAULT 5000);
Query OK, 0 rows affected (0.08 sec)
TOMADO DE: http://mysql.conclase.net/curso/?cap=007