jueves, 21 de febrero de 2008

Tablas

El lenguaje de definición de datos (DDL, Data Definition Language) es el encargado de permitir la descripcion de los objetos que forman una base de datos.

El lenguaje de definición de datos le va a permitir llevar a cabo las siguientes acciones:

  • Creación de tablas, índices y vistas.
  • Modificación de las estructura de tablas, índices y vistas.
  • Supresión de tablas, índices y vistas.

Pero antes de continuar vamos a comentar la nomenclatura que emplearemos, si tiene algún conocimiento de programación le resultará familiar.



Nomenclatura

La sintaxis empleada para la sentencias en las diferentes páginas esta basada en la notación EBNF. Vamos a ver el significado de algunos simbolos.

Símbolo
Significado
< >

Encierran parámetros de una orden que el usuario debe sustituir al escribir dicha orden por los valores que queramos dar a los parámetros.

[ ]

Indica que su contenido es opcional.

{ }

Indica que su contenido puede repetirse una o mas veces.

|

Separa expresiones. Indica que pueden emplearse una u otra expresión pero no más de una a la vez.

Además las palabras clave aparecen en mayúscula negrita y los argumentos en minúscula cursiva.

La sintaxis de una sentencia tendrá un aspecto como este:


CREATE TABLE
<nombre_tabla>
(
<nombre_campo> <tipo_datos(tamaño)>,
{
<nombre_campo> <tipo_datos(tamaño)>}
) ;



Creación de tablas

En el modelo relacional la información de una base de datos se almacena en tablas.

La creación de la base de datos debe comenzar por con la creación de una o más tablas. Para ello utilizaremos la sentencia CREATE TABLE.

La sintaxis de la sentencia es la siguiente:


CREATE TABLE
<nombre_tabla>
(
<nombre_campo> <tipo_datos(tamaño)>
[null | not null] [default <valor_por_defecto>]
{
,<nombre_campo> <tipo_datos(tamaño)>
[null | not null] [default <valor_por_defecto>]}
[
, constraint <nombre> primary key (<nombre_campo>[ ,...n ])]
[
, constraint <nombre> foreign key (<nombre_campo>[ ,...n ])
references ( <nombre_campo> [ ,...n ] ) ]
) ;

Ejemplo: Vamos a simular una base de datos para un negocio de alquiler de coches, por lo que vamos a empezar creando una tabla para almacenar los coches que tenemos.


CREATE TABLE tCoches
(
matricula char(8) not null,
marca varchar(255) null,
modelo varchar(255) null,
color varchar(255) null,
numero_kilometros numeric(14,2) null default 0,
constraint PK_Coches primary key (matricula)
) ;

En este ejemplo creamos una tabla llamada tCoches con cinco campos (matricula, marca, modelo, color, numero_kilometros).

Notese que se han omitido las tildes y los espacios a proposito. Nunca cree campos que contengan caracteres especificos de un idioma (tildes, eñes, ...) ni espacios.

Las claves primarias y externas (o foraneas) se pueden implementar directamente a través de la instrucción CREATE TABLE, o bien se pueden agregar a través de sentencias ALTER TABLE.

Cada gestor de bases de datos implementa distintas opciones para la instrucción CREATE TABLE, pudiendo especificarse gran cantidad de parámetros y pudiendo variar el nombre que damos a los tipos de datos, pero la sintaxis standart es la que hemos mostrado aquí. Si queremos conocer más acerca de las opciones de CREATE TABLE lo mejor es recurrir a la documentación de nuestro gestor de base de datos.


Modificación de tablas

En ocasiones puede ser necesario modificar la estructura de una tabla, comúnmente para añadir un campo o reestricción. Para ello disponemos de la instruccción ALTER TABLE.

ALTER TABLE nos va a permitir:

  • Añadir campos a la estructura incial de una tabla.
  • Añadir reestriciones y referencias.

Para añadir un campo a una tabla existente:


ALTER TABLE
<nombre_tabla>
ADD <tipo_datos(tamaño)>
[null |not null] [default ]
{
, <nombre_campo> <tipo_datos(tamaño)>
[null |not null] [default ]} ;

Ejemplo:


ALTER TABLE
tCoches
ADD num_plazas integer null default 5;

En este ejemplo añadimos el campo num_plazas a la tabla tCoches que habiamos creado en el apartado anterior.

Para añadir una clave primaria vamos a crear una tabla de cliente y le añadiremos la clave primaria ejecutando una sentencia alter table:


CREATE TABLE
tClientes
(
codigo integer not null,
nombre varchar(255) not null,
apellidos varchar(255) null,
nif varchar(10) null,
telefono varchar(9) null,
movil varchar(9) null
);
ALTER TABLE tClientes ADD
CONSTRAINT PK_tClientes primary key (codigo);

Creamos la tabla clientes y le añadimos una reestricción primary key a la que damos el nombre PK_tClientes en el campo codigo.

Solo podemos modificar una única tabla a la vez con ALTER TABLE, para modificar más de una tabla debemos ejecutar una sentencia ALTER TABLE por tabla.

Para añadir una clave externa (o foranea) necesitamos una tercera tabla en nuestra estructura. Por un lado tenemos la tabla tCoches y la tabla tClientes, ahora vamos a crear la tabla tAlquileres que será la encargada de "decirnos" que clientes han alquilado un coche.


CREATE TABLE
tAlquileres
(
codigo integer not null,
codigo_cliente integer not null,
matricula char(8) not null,
fx_alquiler datetime not null,
fx_devolucion datetime null
);

ALTER TABLE tAlquileres ADD
CONSTRAINT
PK_tAlquileres primary key (codigo),
CONSTRAINT FK_Clientes foreign key (codigo_cliente)
references
tClientes (Codigo),
CONSTRAINT FK_Coches foreign key (matricula)
references tCoches (matricula);

Bien, en este código creamos la tabla tAlquileres, y luego mediante una sentencia ALTER TABLE añadimos una clave primaria llamada PK_tAlquileres en el campo codigo, una clave externa llamada FK_Clientes referenciada al codigo de la tabla tClientes, y por último otra clave externa llamada FK_Coches referenciada al campo matricula de la tabla tCoches.

Nota:Cuando creamos una clave externa el campo referenciado y el que sirve de referencia deben ser del mismo tipo de datos.

Si somos observadores nos daremos cuenta que los campos que sirven de referencia a las claves foraneas son las claves primarias de sus tablas. Sólo podemos crear claves externas que referencien claves primarias.

Al igual que ocurria con la sentencia CREATE TABLE cada gestor de bases de datos implementa sus mejoras, siendo la mejor forma de conocerlas recurrir a la documentación del gestor de bases de datos.

En principio, para borrar columnas de una tabla debemos:

  1. Crear una tabla con la nueva estructura.
  2. Transferir los datos
  3. Borrar la tabla original.

y digo en principio, porque como ya hemos comentado según el gestor de bases de datos con el que trabajemos podremos realizar esta tarea a través de una sentencia ALTER TABLE.



Eliminación de tablas.

Podemos eliminar una tabla de una base de datos mediante la instruccion DROP TABLE.


DROP TABLE
<nombre_tabla>;

La instrucción DROP TABLE elimina de forma permanente la tabla y los datos en ella contenida.

Si intentamos eliminar una tabla que tenga registros relacionados a través de una clave externa la instrucción DROP TABLE fallará por integridad referencial.

Cuando eliminamos una tabla eliminamos también sus índices.