1.2. Creacion de tablas

1.2. Creacion de tablas Dataprix 22 Septiembre, 2009 - 10:57

Como ya hemos visto, la estructura de almacenamiento de los datos del modelo relacional son las tablas. Para crear una tabla, es necesario utilizar la sentencia CREATE TABLE. Veamos su formato:

 

 

         

 

 

Donde definición_columna es:

 

 

 

El proceso que hay que seguir para crear una tabla es el siguiente:

1)  Lo primero que tenemos que hacer es decidir qué nombre queremos poner a la tabla (nombre_tabla).

2)  Después, iremos dando el nombre de cada uno de los atributos que formarán las columnas de la tabla (nombre_columna).

3)  A cada una de las columnas le asignaremos un tipo de datos predefinido o bien un dominio definido por el usuario. También podremos dar definiciones por defecto y restricciones de columna.

4)  Una vez definidas las columnas, sólo nos quedará dar las restricciones de tabla.

1.2.1. Tipos de datos

1.2.1. Tipos de datos Dataprix 22 Septiembre, 2009 - 11:45

Para cada columna tenemos que elegir entre algún dominio definido por el usuario o alguno de los tipos de datos predefinidos que se describen a continuación:

 

                                                                                                                                                                           
                                                                                                                                                    

                                                                                                                                                                                                      

 

  

 

       

 

 

 Ejemplos de asignaciones de columnas

 Veamos algunos ejemplos de asignaciones de columnas en los tipos de datos predefinidos DATE, TIME y TIMESTAMP:

 

•   La columna fecha_nacimiento podría ser del tipo DATE y podría tener como valor ‘1978-12-25’.

•   La  columna  inicio_partido podría  ser  del  tipo  TIME y  podría  tener  como  valor ‘17:15:00.000000’.

•   La columna entrada_trabajo podría ser de tipo TIMESTAMP y podría tener como valor ‘1998-7-8 9:30:05’.

1.2.2. Creacion, modificacion y borrado de dominios

1.2.2. Creacion, modificacion y borrado de dominios Dataprix 22 Septiembre, 2009 - 12:07
Dominios definidos por el usuario
Aunque el SQL92 nos ofrece la sentencia CREATE DOMAIN, hay pocos sistemas relacionales comerciales que nos permitan utilizarla.

Además de los dominios dados por el tipo de datos predefinidos, el SQL92 nos ofrece la posibilidad de trabajar con dominios definidos por el usuario.

Para crear un dominio es necesario utilizar la sentencia CREATE DOMAIN:

 

CREATE DOMAIN nombre dominio [AS] tipos_datos
              [def_defecto] [restricciones_dominio];

 

donde restricciones_dominio tiene el siguiente formato:

 

[CONSTRAINT nombre_restricción] CHECK (condiciones)

 

Creación de un dominio en BDUOC

Si quisiéramos definir un dominio para las ciudades donde se encuentran los departamentos de la empresa BDUOC, haríamos:

 

CREATE DOMAIN dom_ciudades AS CHAR (20)
CONSTRAINT ciudades_validas
CHECK (VALUE IN (‘Barcelona’, ‘Tarragona’, ‘Lleida’, ‘Girona’));

De este modo, cuando definimos la columna ciudades dentro de la tabla departamentos no se tendrá que decir que es de tipo CHAR (20), sino de tipo dom_ciudades. Esto nos debería asegurar, según el modelo relacional, que sólo haremos operaciones sobre la columna ciudades con otras columnas que tengan este mismo dominio definido por el usuario; sin embargo, el SQL92 no nos ofrece herramientas para asegurar que las comparaciones que hacemos sean entre los mismos dominios definidos por el usuario.

Por ejemplo, si tenemos una columna con los nombres de los empleados definida sobre el tipo de datos CHAR (20), el SQL nos permite compararla con la columna ciudades, aunque semánticamente no tenga sentido. En cambio, según el modelo relacional, esta comparación no se debería haber permitido.

Para borrar un dominio definido por el usuario es preciso utilizar la sentencia DROP DOMAIN, que tiene este formato:

 

DROP DOMAIN nombre_dominio {RESTRICT|CASCADE};

 

En este caso, tenemos que:

 

•    La opción de borrado de dominios RESTRICT hace que el dominio sólo se pueda borrar si no se utiliza en ningún sitio.

•    La opción CASCADE borra el dominio aunque esté referenciado, y pone el tipo de datos del dominio allí donde se utilizaba.

 

Borrar un dominio de BDUOC

 

Si quisiéramos borrar el dominio que hemos creado antes para las ciudades donde se encuentran los departamentos de la empresa BDUOC, haríamos:

DROP DOMAIN dom_ciudades RESTRICT;

 

En este caso nos deberíamos asegurar de que ninguna columna está definida sobre dom_ciudades antes de borrar el dominio.

 

Para  modificar  un  dominio  semántico  es  necesario  utilizar  la  sentencia ALTER DOMAIN. Veamos su formato:

 

ALTER DOMAIN nombre_dominio {acción_modificar_dominio|
                         acción_modif_restricción_dominio};

 

Donde tenemos lo siguiente:

 

•    acción_modificar_dominio puede ser:

{SET def_defecto|DROP DEFAULT}

 

•    acción_modif_restricción_dominio puede ser:

{ADD restricciones_dominio|DROP CONSTRAINT nombre_restricción}

 

Modificar un dominio en BDUOC

 

Si quisiéramos añadir una nueva ciudad (Mataró) al dominio que hemos creado antes para las ciudades donde se encuentran los departamentos de la empresa BDUOC, haríamos:

ALTER DOMAIN dom_ciudades DROP CONSTRAINT ciudades_validas;

 

Con esto hemos eliminado la restricción de dominio antigua. Y ahora tenemos que introducir la nueva restricción:

ALTER_DOMAIN dom_ciudades ADD CONSTRAINT ciudades_validas
CHECK (VALUE IN (‘Barcelona’, ‘Tarragona’, ‘Lleida’, ‘Girona’, ‘Mataro’));

1.2.3. Definiciones por defecto

1.2.3. Definiciones por defecto Dataprix 22 Septiembre, 2009 - 12:15

Ya hemos visto en otros módulos la importancia de los valores nulos y su inevitable aparición como valores de las bases de datos.

La opción def_defecto nos permite especificar qué nomenclatura queremos dar a nuestros valores por omisión.

Por ejemplo, para un empleado que todavía no se ha decidido cuánto ganará, podemos elegir que, de momento, tenga un sueldo de 0 euros (DEFAULT 0.0), o bien que tenga un sueldo con un valor nulo (DEFAULT NULL).

Sin embargo,  hay que tener en cuenta que  si  elegimos la opción  DEFAULT NULL, la columna para la que daremos la definición por defecto de valor nulo debería admitir valores nulos.

La opción DEFAULT tiene el siguiente formato:

 

DEFAULT (literal|función|NULL)

 

La posibilidad más utilizada y la opción por defecto, si no especificamos nada, es la palabra reservada NULL. Sin embargo, también podemos definir nuestro propio literal, o bien recurrir a una de las funciones que aparecen en la tabla siguiente:

Finción Descripción
{USER CURRENT_USER} Identificador del usuario actual
SESSION_USER Identificador del usuario de esta sesión
SYSTEM_USER Identificador del usuario del sistema operativo
CURRENT_DATE Fecha actual
CURRENT_TIME Hora actual
CURRENT_TIMESTAMP Fecha y hora actuales

 

1.2.4. Restricciones de columna

1.2.4. Restricciones de columna Dataprix 22 Septiembre, 2009 - 12:16

En cada una de las columnas de la tabla, una vez les hemos dado un nombre y hemos definido su dominio, podemos imponer ciertas restricciones que siempre se tendrán que cumplir. Las restricciones que se pueden dar son las que aparecen en la tabla que tenemos a continuación:

Restricciones de columna
Restricción Descripción
NOT NULL La columna no puede tener valores nulos.
UNIQUE  La columna no puede tener valores repetidos. Es una clave alternativa.
PRIMARY KEY  La columna no puede tener valores repetidos ni nulos. Es la clave primaria.
 REFERENCES  tabla [ (columna) ]  La columna es la clave foránea de la columna de la tabla especificada.
CHECK (condiciones)  La columna debe cumplir las condiciones especificas.

 

1.2.5. Restricciones de tabla

1.2.5. Restricciones de tabla Dataprix 23 Septiembre, 2009 - 11:47

Una vez hemos dado un nombre, hemos definido una tabla y hemos impuesto ciertas restricciones para cada una de las columnas, podemos aplicar restricciones sobre toda la tabla, que siempre se deberán cumplir. Las restricciones que
se pueden dar son las siguientes:

Restricciones de tabla
Restricción Descripción
UNIQUE
(columna [, columna...])
El conjunto de las columnas especificadas no puede tener valores repetidos. Es una clave alternativa
PRIMARY KEY
(columna [, columna...])
El conjunto de las columnas espacificadas no puede tener valores nulos ni repetidos. Es una clave primaria
FOREIGN KEY
(columna [, columna...])
REFERENCES tabla
[(columna2 [, columna2...])]
El conjunto de las columnas especificadas es una clave foránea que referencia la clave primaria formada por el conjunto de las columnas2 se denominan exactamente igual, entonces no sería necesario poner columnas2.
CHECK (condiciones) La tabla debe cumplir las condiciones especificadas.

 

1.2.6. Modificacion y borrado de claves con claves foráneas que hacen referncia a éstas

1.2.6. Modificacion y borrado de claves con claves foráneas que hacen referncia a éstas Dataprix 23 Septiembre, 2009 - 11:50

En otra unidad de este curso hemos visto tres políticas aplicables a los casos de borrado y modificación de filas que tienen una clave primaria referenciada por claves foráneas. Estas políticas eran la restricción, la actualización en cascada y la anulación.

El SQL nos ofrece la posibilidad de especificar, al definir una clave foránea, qué política queremos seguir. Veamos su formato:

 

CREATE TABLE nombre_tabla
             ( definición_columna
             [, definición_columna. . .]
             [, restricciones_tabla]
             );

 

Donde una de las restricciones de tabla era la definición de claves foráneas, que tiene el siguiente formato:

 

FOREIGN KEY clave_secundaria REFERENCES tabla [(clave_primaria)]
[ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]
[ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}]

Donde NO ACTION corresponde a la política de restricción; CASCADE, a la actualización en cascada, y SET NULL sería la anulación. SET DEFAULT se podría considerar una variante de SET NULL, donde en lugar de valores nulos se puede poner
el valor especificado por defecto.

1.2.7. Aserciones

1.2.7. Aserciones Dataprix 23 Septiembre, 2009 - 11:52

Una aserción es una restricción general que hace referencia a una o más columnas de más de una tabla. Para definir una aserción se utiliza la sentencia CREATE ASSERTION, y tiene el siguiente formato:

 

CREATE ASSERTION nombre_aserción CHECK (condiciones);

 

Crear una aserción en BDUOC

Creamos una aserción sobre la base de datos BDUOC que nos asegure que no hay ningún empleado con un sueldo superior a 80.000 asignado al proyecto SALSA:

CREATE ASSERTION restriccion1 CHECK (NOT EXISTS (SELECT *
                              FROM proyectos p, empleados e
                              WHERE p.codigo_proyec =
                              = e.num_proyec and e.sueldo > 8.0E+4
                              and p.nom_proj = ‘SALSA’) );

Para borrar una aserción es necesario utilizar la sentencia DROP ASSERTION, que presenta este formato:

 

DROP ASSERTION nombre_aserción;

 

Borrar una aserción en BDUOC

 

Por  ejemplo,  para  borrar  la  aserción restriccion1,  utilizaríamos  la  sentencia DROP ASSERTION de la forma siguiente:

DROP ASSERTION restriccion1;