lunes, 8 de agosto de 2011

TRIGGER

Un trigger (o disparador) en una Base de datos , es un procedimiento que se ejecuta cuando se cumple una condición establecida al realizar una operación. Dependiendo de la base de datos, los triggers pueden ser de inserción (INSERT), actualización (UPDATE) o borrado (DELETE). Algunas bases de datos pueden ejecutar triggers al crear, borrar o editar usuarios, tablas, bases de datos u otros objetos.

Usos
Son usados para mejorar la administración de la Base de datos, sin necesidad de contar con que el usuario ejecute la sentencia de SQL.
Además, pueden generar valores de columnas, previene errores de datos, sincroniza tablas, modifica valores de una vista, etc.
Permite implementar programas basados en paradigma lógico (sistemas expertos, deducción).

Componentes principales
La estructura básica de un trigger es:
  • Llamada de activación: es la sentencia que permite "disparar" el código a ejecutar.
  • Restricción: es la condición necesaria para realizar el código. Esta restricción puede ser de tipo condicional o de tipo nulidad.
  • Acción a ejecutar: es la secuencia de instrucciones a ejecutar una vez que se han cumplido las condiciones iniciales.
Tipos
Existen dos tipos de disparadores que se clasifican según la cantidad de ejecuciones a realizar:
  • Row Triggers (o Disparadores de fila): son aquellas que se ejecutaran n-veces si se llama n-veces desde la tabla asociada al trigger
  • Statement Triggers (o Disparadores de secuencia): son áquellos que sin importar la cantidad de veces que se cumpla con la condición, su ejecución es única.
Pueden ser de sesión y almacenados; pero no son de fiar

Efectos y características
  • No aceptan parámetros o argumentos (pero podrían almacenar los datos afectados en tablas temporales)
  • No pueden ejecutar las operaciones COMMIT o ROLLBACK por que estas son parte de la sentencia SQL del disparador (únicamente a través de transacciones autónomas)
  • Pueden causar errores de mutaciones en las tablas, si se han escrito de manera deficiente.

Ejemplo
Un sencillo ejemplo (para SQL Server) sería crear un Trigger para insertar un pedido de algún producto cuando la cantidad de éste, en nuestro almacén, sea inferior a un valor dado.
BEFORE UPDATE ON tabla_almacen
FOR ALL records
    IF :NEW.producto < 100 THEN
         INSERT INTO tabla_pedidos(producto) VALUES ('1000');
    END IF;
SELECT DBO.POLVE.TEST
END
 

FUNCION

Funciones de valores simples:

ABS(n)= Devuelve el valor absoluto de (n).
CEIL(n)=Obtiene el valor entero inmediatamente superior o igual a "n".
FLOOT(n) = Devuelve el valor entero inmediatamente inferior o igual a "n".
MOD (m, n)= Devuelve el resto resultante de dividir "m" entre "n".
NVL (valor, expresión)= Sustituye un valor nulo por otro valor.
POWER (m, exponente)= Calcula la potencia de un numero.
ROUND (numero [, m])= Redondea números con el numero de dígitos de precisión indicados.
SIGN (valor)= Indica el signo del "valor".
SQRT(n)= Devuelve la raíz cuadrada de "n".
TRUNC (numero, [m])= Trunca números para que tengan una cierta cantidad de dígitos de precisión.
VAIRANCE (valor)= Devuelve la varianza de un conjunto de valores.

Funciones de grupos de valores:

AVG(n)= Calcula el valor medio de "n" ignorando los valores nulos.
COUNT (* | Expresión)= Cuenta el numero de veces que la expresión evalúa algún dato con valor no nulo. La opción "*" cuenta todas las filas seleccionadas.
MAX (expresión)= Calcula el máximo.
MIN (expresión)= Calcula el mínimo.
SUM (expresión)= Obtiene la suma de los valores de la expresión.
GREATEST (valor1, valor2…)= Obtiene el mayor valor de la lista.
LEAST (valor1, valor2…)= Obtiene el menor valor de la lista.

Funciones que devuelven valores de caracteres:

CHR(n) = Devuelve el carácter cuyo valor en binario es equivalente a "n".
CONCAT (cad1, cad2)= Devuelve "cad1" concatenada con "cad2".
LOWER (cad)= Devuelve la cadena "cad" en minúsculas.
UPPER (cad)= Devuelve la cadena "cad" en mayúsculas.
INITCAP (cad)= Convierte la cadena "cad" a tipo titulo.
LPAD (cad1, n[,cad2])= Añade caracteres a la izquierda de la cadena hasta que tiene una cierta longitud.
RPAD (cad1, n[,cad2])= Añade caracteres a la derecha de la cadena hasta que tiene una cierta longitud.
LTRIM (cad [,set])= Suprime un conjunto de caracteres a la izquierda de la cadena.
RTRIM (cad [,set])= Suprime un conjunto de caracteres a la derecha de la cadena.
REPLACE (cad, cadena_busqueda [, cadena_sustitucion])= Sustituye un carácter o caracteres de una cadena con 0 o mas caracteres.
SUBSTR (cad, m [,n])= Obtiene parte de una cadena.
TRANSLATE (cad1, cad2, cad3)= Convierte caracteres de una cadena en caracteres diferentes, según un plan de sustitución marcado por el usuario.

Funciones que devuelven valores numéricos:

ASCII(cad)= Devuelve el valor ASCII de la primera letra de la cadena "cad".
INSTR (cad1, cad2 [, comienzo [,m]])= Permite una búsqueda de un conjunto de caracteres en una cadena pero no suprime ningún carácter después.
LENGTH (cad)= Devuelve el numero de caracteres de cad.

Funciones para el manejo de fechas:

SYSDATE= Devuelve la fecha del sistema.
ADD_MONTHS (fecha, n)= Devuelve la fecha "fecha" incrementada en "n" meses.
LASTDAY (fecha)= Devuelve la fecha del último día del mes que contiene "fecha".
MONTHS_BETWEEN (fecha1, fecha2)= Devuelve la diferencia en meses entre las fechas "fecha1" y "fecha2".
NEXT_DAY (fecha, cad)= Devuelve la fecha del primer día de la semana indicado por "cad" después de la fecha indicada por "fecha".

Funciones de conversión:

TO_CHAR= Transforma un tipo DATE ó NUMBER en una cadena de caracteres.
TO_DATE= Transforma un tipo NUMBER ó CHAR en DATE.
TO_NUMBER= Transforma una cadena de caracteres en NUMBER.

PROCEDIMIENTO

Un procedimiento es un programa dentro de la base de datos que ejecuta una acción o conjunto de acciones especificas.
    Un procedimiento tiene un nombre, un conjunto de parámetros (opcional) y un bloque de código.
    En Transact SQL los procedimientos almacenados pueden devolver valores (numerico entero) o conjuntos de resultados.
    Para crear un procedimiento almacenado debemos emplear la sentencia CREATE PROCEDURE.



CREATE PROCEDURE <nombre_procedure> [@param1 <tipo>, ...]AS-- Sentencias del procedure


    Para modificar un procedimiento almacenado debemos emplear la sentencia ALTER PROCEDURE.



ALTER PROCEDURE <nombre_procedure> [@param1 <tipo>, ...]AS-- Sentencias del procedure 


    El siguiente ejemplo muestra un procedimiento almacenado, denominado spu_addCliente que inserta un registro en la tabla "CLIENTES".



CREATE PROCEDURE spu_addCliente @nombre varchar(100),				@apellido1 varchar(100),				@apellido2 varchar(100),				@nifCif varchar(20),				@fxNaciento 
AS
INSERT
datetime INTO CLIENTES(nombre, apellido1, apellido2, nifcif, fxnacimiento) VALUES(@nombre, @apellido1, @apellido2, @nifCif, @fxNaciento)


    Para la ejecutar un procedimiento almacenado debemos utilizar la sentencia EXEC. Cuando la ejecución del procedimiento almacenado es la primera instrucción del lote, podemos omitir el uso de EXEC.
    El siguiente ejemplo muestra la ejecución del procedimiento almacenado anterior.



DECLARE
set @fecha_nacimiento datetime @fecha_nacimiento = convert(datetime, '13/05/1975', 103)EXEC spu_addCliente 'Pedro', 'Herrarte', 'Sanchez', 
		    '00000002323', @fecha_nacimiento


    Siempre es deseable que las instrucciones del procedure esten dentro de un bloque TRY CATCH y controlados por una transacción.



ALTER PROCEDURE spu_addCliente  @nombre varchar(100),				@apellido1 varchar(100),				@apellido2 varchar(100),				@nifCif varchar(20),				@fxNaciento 
AS
BEGINdatetime TRY
END BEGIN
BEGIN TRAN INSERT INTO CLIENTES(nombre, apellido1, apellido2, nifcif, fxnacimiento) VALUES (@nombre, @apellido1, @apellido2, @nifCif, @fxNaciento) COMMIT TRY CATCH
ROLLBACKPRINT ERROR_MESSAGE()END CATCH


    Si queremos que los parámetros de un procedimiento almacenado sean de entrada-salida debemos especificarlo a través de la palabra clave OUTPUT , tanto en la definición del procedure como en la ejecución.
    El siguiente ejemplo muestra la definición de un procedure con parámetros de salida.



CREATE
@saldo  PROCEDURE spu_ObtenerSaldoCuenta @numCuenta varchar(20), decimal(10,2) output AS
BEGIN
SELECT @saldo = SALDO FROM CUENTASWHERE NUMCUENTA = @numCuentaEND


     Y para ejecutar este procedure:



DECLARE @saldo decimal(10,2)EXEC
PRINT spu_ObtenerSaldoCuenta '200700000001', @saldo output @saldo 


    Un procedimiento almacenado puede devolver valores numericos enteros a través de la instrucción RETURN. Normalmente debemos utilizar los valores de retorno para determinar si la ejecución del procedimiento ha sido correcta o no. Si queremos obtener valores se recomienda utilizar parámetros de salida o funciones escalares (se verán mas adelante en este tutorial).
    El siguiente ejemplo muestra un procedimiento almacenado que devuelve valores.



CREATE PROCEDURE spu_EstaEnNumerosRojos @numCuenta varchar(20)AS
BEGIN
IF (SELECT SALDO FROM CUENTAS WHERE NUMCUENTA = @numCuenta) < 0BEGIN RETURN 1ENDELSE RETURN 0END


    El siguiente ejemplo muestra como ejecutar el procedure y obtener el valor devuelto.



DECLARE
EXEC @rv int @rv = spu_EstaEnNumerosRojos '200700000001'PRINT @rv 


    Otra caracteristica muy interesante de los procedimientos almacenados en Transact SQL es que pueden devolver uno o varios conjuntos de resultados.
    El siguiente ejemplo muestra un procedimiento almacenado que devuelve un conjunto de resultados.



CREATE PROCEDURE spu_MovimientosCuenta @numCuenta varchar(20)AS
BEGIN
SALDO_ANTERIOR SALDO_POSTERIOR IMPORTE FXMOVIMIENTO
SELECT @numCuenta, , , , FROM MOVIMIENTOSINNER JOIN CUENTAS ON MOVIMIENTOS.IDCUENTA = CUENTAS.IDCUENTAWHERE NUMCUENTA = @numCuentaORDER BY FXMOVIMIENTO DESCEND


    La ejecución del procedimiento se realiza normalmente.



EXEC spu_MovimientosCuenta '200700000001' 


    El resultado de la ejecucion ...
NUMCUENTA     SALDO_ANTERIOR SALDO_POSTERIOR  IMPORTE FXMOVIMIENTO
------------  -------------- ---------------- ------- -----------------------
200700000001  50.99          100.99           50.00   2007-08-25 16:18:36.490
200700000001  0.99           50.99            50.00   2007-08-23 16:20:41.183
200700000001  50.99          0.99             50.00   2007-08-23 16:16:29.840
200700000001  0.99           50.99            50.00   2007-08-23 16:14:05.900

PROCEDIMIENTO ANONIMO

Bloques anónimos PL/SQL

Empezaremos con los bloques anónimos, caracterizados porque no tienen nombre y se suelen crear y ejecutar desde PL/SQL.
Todo bloque debe acabar en . para que sea almacenado en el buffer SQL. Una vez guardado lo podemos ejecutar con la orden “run”. También podemos guardarlo en un fichero con la siguiente orden:
save nombrefichero [replace]
El replace sólo lo pondremos si el fichero ya esta creado.
Para cargar y ejecutar este bloque anónimo guardado en fichero ejecutaremos la siguiente orden:
start nombrefichero
El start lo podemos cambiar por la @ y nos funcionará igualmente.
Pero también podemos cargarlo sin ejecutarlo con la orden “get” y luego ejecutarlo posteriormente con la orden “run”
Un ejemplo muy sencillo de bloque seria el que nos muestra en pantalla un nombre.
BEGIN
   DBMS_OUTPUT.PUT_LINE('nombre');
END;
.

Además en los bloques PL/SQL se pueden utilizar lo que llamamos variables de sustitución, que nos pedirán datos por pantalla antes de ejecutar el bloque. Estas variables tienen que ir antepuestas del & para que funcionen.
Un ejemplo seria un bloque que nos pide el DNI de un usuario y nos muestra su nombre.
DECLARE
   Vnom clientes.nombre%TYPE;
BEGIN
   select nombre into Vnom from clientes where NIF= '&V_nif';
   DBMS_OUTPUT.PUT_LINE (Vnom);
END;
.

Como veis es bastante sencillo, pero no tienen tanta funcionalidad como los procedimientos o funciones.

Procedimientos y funciones PL/SQL

Los procedimientos y funciones quedan almacenados en la base de datos a diferencia de los bloques anónimos que se almacenaban en el buffer.
 
Nota: Al quedar los bloques anónimos almacenados en el buffer, a no ser que se guardasen en ficheros, se perderían al limpiar el buffer, cosa que no ocurre con los procedimientos y funciones, que se almacenan en la propia base de datos.

Otra cosa que nos diferencia los bloques anónimos de los procedimientos o funciones es que en los procedimientos o funciones no se pueden utilizar variables de sustitución.
En cuanto a su construcción es la dada en el articulo Características de PL/SQL segunda parte añadiendo al principio la siguiente secuencia “CREATE OR REPLACE” para crearlo, o modificarlo si ya existe.
Pasamos a escribir un procedimiento que nos muestre los datos de un usuario:
CREATE OR REPLACE PROCEDURE ver_usuario(nomusu VARCHAR2)
IS
   NIFusu   VARCHAR2(10);
   Domusu   VARCHAR2(10);
BEGIN
   select nif, domicilio into NIFusu,Domusu from usuario where nombre=nomusu;
   DBMS_OUTPUT.PUT_LINE('Nombre:'||nomusu|| 'NIF:' ||NIFusu|| 'Domicilio' ||Domusu);
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('No hemos encontrado al usuario || nomusu);
END;
/

Si el compilador detecta errores nos saldrá un mensaje como este: “Procedimiento creado con errores de compilación”. Para ver estos errores tenemos la orden SHOW ERRORS.
Al tener almacenado el procedimiento en la base de datos, este puede ser llamado por cualquier usuario que tenga los permisos oportunos. Para invocar un procedimiento utilizamos la orden EXECUTE
Para invocar al procedimiento que hemos creado antes tendríamos que ejecutar la siguiente orden:
EXECUTE ver_usuario('Luis');
Pero también podemos invocarlo desde un bloque PL/SQL de ls siguiente forma:
BEGIN
   ver_usuario('Luis');
END;
.

Como en cualquier lenguaje, podemos agregar comentarios a nuestros procedimientos de la siguiente forma:
- - para comentar en una sola linea
/* <comentario>*/ para varias lineas.

MODELO RELACIONAL

1-*¿Cuáles  son las ventajas que ofrece el modelo relacional?
Las ventajas de este éxito son fundamentalmente dos:
1. ofrecen sistemas simples y eficaces para representar y manipular los datos2. se basan en un modelo, el relacional, con sólidas bases teóricas.
2-*¿Cuándo surge el modelo relacional y por quien?
El modelo relacional fue propuesto originariamente por E.F. Codd en un ya famoso artículo de 1970. Gracias a su coherencia y facilidad de uso, el modelo se ha convertido en los años 80 en el más usado para la producción de DBMS
3-*¿En qué consiste el modelo relacional?
La estructura fundamental del modelo relacional es precisamente esa, "relación", es decir una tabla bidimensional constituida por líneas (tuple) y columnas (atributos). Las relaciones representan las entidades que se consideran interesantes en la base de datos. Cada instancia de la entidad encontrará sitio en una tupla de la relación, mientras que los atributos de la relación representarán las propiedades de la entidad.
4-*¿Qué ventaja es la que destaca más en el modelo relacional?
Una de las grandes ventajas del modelo relacional es que define también un álgebra, llamada "álgebra relacional". Todas las manipulaciones posibles sobre las relaciones se obtienen gracias a la combinación de tan sólo cinco operadores: RESTRICT, PROJECT, TIMES, UNION y MINUS. Por comodidad, se han definido también tres operadores adicionales que de todos modos se pueden obtener aplicando los cinco fundamentales: JOIN, INTERSECT y DIVIDE. Los operadores relacionales reciben como argumento una relación o un conjunto de relaciones y restituyen una única relación como resultado.
5-*¿En que consiste cada uno de los mencionados anterior mente?
RESTRICT: restituye una relación que contiene un subconjunto de las tuplas de la relación a la que se aplica. Los atributos se quedan como estaban.
PROJECT: restituye una relación con un subconjunto de los atributos de la relación a la que viene aplicado. Las tuplas de la relación resultado se componen de las tuplas de la relacion original, de manera que siguen siendo un conjunto en sentido matemático.
TIME: se aplica a dos relaciones y efectúa el producto cartesiano de las tuplas. Cada tupla de la primera relación está concatenada con cada tupla de la segunda.
JOIN: se concatenan las tuplas de dos relaciones de acuerdo con el valor de un conjunto de sus atributos.
UNION: aplicando este operador a dos relaciones compatibles, se obtiene una que contiene las tuplas de ambas relaciones. Dos relaciones son compatibles si tienen el mismo número de atributos y los atributos correspondientes en las dos relaciones tienen el mismo dominio.
MINUS: aplicado a dos relaciones compatibles restituye una tercera que contiene las tuplas que se encuentran sólo en la primera relación.
INTERSECT: aplicado a dos relaciones compatibles restituye una relación que contiene las tuplas que existen en ambas.
DIVIDE: aplicado a dos relaciones que tengan atributos comunes, restituye una tercera que contiene todas las tuplas de la primera relación que se puede hacer que correspondan con todos los valores de la segunda relación.

6-*¿Qué es el álgebra relacional?
El aspecto dinámico del modelo relacional en lo que al álgebra se refiere, lo constituye una colección de operadores que, aplicados a las relaciones, dan como resultado nuevas relaciones (propiedad de cierre).
 
Los operandos del álgebra son las relaciones y los operadores se aplican a las relaciones a fin de formular consultas a la BD.
 
Son cinco los operadores que podríamos llamar primitivos: los tradicionales de teoría de conjuntos unión, diferencia y producto cartesiano, y los especialmente introducidos por Codd de restricción y proyección; además, existen otros operadores que se pueden considerar derivados, ya que se pueden deducir de los primitivos.
 

7-*¿Qué es un esquema?
Un esquema es la definición de una estructura (generalmente relaciones o tablas de una base de datos), es decir, determina la identidad de la relación y que tipo de información podrá ser almacenada dentro de ella; en otras palabras, el esquema son los metadatos de la relación. Todo esquema constará de:
  • Nombre de la relación (su identificador).
  • Nombre de los atributos (o campos) de la relación y sus dominios; el dominio de un atributo o campo define los valores permitidos para el mismo, es equivalente al tipo de dato por ejemplo character, integer, date, string, etc.

8-*¿Cuántos elementos característicos contiene el modelo relacional?
Una relación se puede representar en forma de tabla, pero va a tener una serie de elementos característicos:
 
  • ·        No puede haber filas duplicadas, es decir, todas las tuplas tienen que ser distintas.
  • ·        El orden de las filas es irrelevante.
  • ·        La tabla es plana, es decir, en el cruce de una fila y una columna sólo puede haber un valor (no se admiten atributos multivaluados).

9-*¿Menciona algunos conceptos básicos del modelo relacional?

Entidad: Igual que en el esquema ER. También se les llama tuplas o filas de la relación.
 Atributo: Igual que en el esquema ER. También se le llaman columnas de la relación.
El dominio de los atributos tiene que ser simple: no se admiten atributos multivalorados ni
compuestos.
 Esquema de una relación: viene dado por el nombre de la relación y una lista de atributos.
Es el tipo de entidad.
 Conjunto de entidades: Relación o tabla.





10-*¿Por terminología que es lo que pondrías?

Modelo Relacional  Modelos de bases de datos

 Creado por Codd a Principios de los 70

 Modelo lógico de datos de no muy alto nivel, orientado a registro.

 Sólida base teórica.

 Implementado en muchos SGBD.

 El concepto principal es la relación o tabla .

OJO: No hay que confundir la tabla con las relaciones del modelo ER. Aquí las relaciones
valen para tipos de relaciones igual que para tipos de entidades.

EN RESUMEN ESTO ES UN DICCIONARIO DE DATOS

Son aquellos para los cuales no hay una descomposición significativa. Por ejemplo, puede ser que no se requiera descomponer el nombre de una persona en primer-nombre, apellido-materno y apellido-paterno; esto depende del contexto del sistema que se esté modelando. Cuando se han identificado los datos elementales, deben ser introducidos en el DD y proveer una breve descripción que describa el significado del dato. En el caso de que el dato tenga un nombre significativo, se puede omitir la descripción, sin embargo; es importante especificar las unidades de medida que el dato puede tomar.
Ejemplo: Masa = * masa del paciente al ingresar al hospital *
  • unidad: kilo, rango:2-150 *

Altura = * unidad: cm, rango: 100-200 * Sexo = * valores : [F|M] *
Se usa para indicar ocurrencias repetidas de un componente en un elemento compuesto.
Ejemplo: Orden-de-compra = nombre-cliente + dirección-de-envío + {artículo} significa que una orden de compra siempre debe contener un nombre de cliente, una dirección de envío y cero o más ocurrencias de un artículo.
Ejemplo: Se pueden especificar límites superiores e inferiores a las iteraciones. Orden-de compra = nombre-cliente + dirección-de-envío + 1{artículo}10 significa que una orden de compra siempre debe contener un nombre de cliente, una dirección de envío y de 1 a 10 artículos.



Ejemplos de iteraciones con límites:
a = 1{b}
a = {b}10
a = 1{b}10
a = {b}
EJEMPLO REGISTRO DE EMPLEADOS = {Registro del empleado}
REGISTRO DE TIEMPOS DEL EMPLEADO = {Registro de tiempos del empleado}
Registro del empleado =
* Datos de cada empleado*
Número de empleado + Información personal + Información de pago + Información de pago actual + Información anual
Registro de tiempos del empleado = Número de empleado + Nombre del empleado + Horas trabajadas
Cheque de pago del empleado = Número de empleado + Nombre de empleado + Dirección + Cantidades del pago actual + 5
Produce el cheque de pago del empleado
REGISTRO DE TIEMPOS DEL EMPLEADO
Empleado
Cheque de pago del empleado
Registro del empleado
Registro de tiempos del empleado

REGISTRO DE EMPLEADOS
El DD provee información del DER. En general, las instancias del DER corresponden a los almacenes de datos de los DFD. EJEMPLO: CLIENTES = {cliente}
cliente = nombre-cliente + dirección + número-teléfono
compra = * asociación entre un cliente y uno o más artículos *
nombre-cliente + 1{id-artículo + cantidad-artículos}
ARTÍCULOS = {artículo}
artículo = id-artículo + descripción
En el ejemplo anterior, cliente es la definición de un tipo de objeto (entidad) y una instancia del almacén de datos CLIENTES. La llave de cliente es el atributo nombre-cliente, el cual diferencia una instancia de otra. El signo @ es usado para indicar los campos llave, o bien estos campos llave se subrayan.

RESTRICCIONES DE LA BASE DE DATOS

Restricciones (constraints)
Las restricciones permiten definir el modo en que SQL Server automáticamente fuerza la integridad de la base de datos. Las restricciones definen reglas indicando los valores permitidos en las columnas y son el mecanismo estándar para asegurar integridad. Usar restricciones es preferible a usar desencadenadores, reglas o valores por defecto. El query optimizer (optimizador de consultas) de SQL Server utiliza definiciones de restricciones para construir planes de ejecución de consultas de alto rendimiento.
Formato de restricción de columna:
   CREATE TABLE NOMBRE_TABLA
(COL1 TIPO_DATO [CONSTRAINT NOMBRE_RESTRICCION] PRIMARY KEY
   COL2 TIPO_DATO

)[TABLESPACE ESPACIO_DE_TABLA];

Formato de restricción de tabla:
   CREATE TABLE NOMBER_TABLA
   (COL1 TIPO_DATO,
   COL2 TIPO_DATO,

[CONSTRAINT NOMBRERESTRICCION] PRIMARY KEY (COLUMNA [,COLUMNA]),

)[TABLESPACE ESPACIO_DE_TABLA];

Claves ajenas: Foreign Key:
Esta formada por una o varias columnas que están asociadas a una clave primaria de otra o de la misma tabla. Se pueden definir tantas claves ajenas como se precise, y pueden estar o no en la misma tabla que la clave primaria. El valor de la columna o columnas que son claves ajenas debe ser: NULL o igual a un valor de la clave referenciada (regla de integridad referencial).
Formato de restricción de columna:
   CREATE TABLE NOMBRE_TABLA
   (COLUMNA1 TIPO_DATO
   [CONSTRAINT NOMBRERESTRICCION]
REFERENCES NOMBRETABLA [(COLUMNA)] [ON DELETE CASCADE]
      …
      )[TABLESPACE ESPECIO_DE_TABLA];

Formato de restricción de tabla:
   CREATE TABLE NOMBRE_TABLA
   (COLUMNA1 TIPO_DATO,
   COLUMNA2 TIPO_DATO,
   …
   [CONTRAINT NOMBRERESTRICCION]
   FOREIGN KEY (COLUMNA [,COLUMNA])
      REFERENCES NOMBRETABLA [(COLUMNA [,
      COLUMNA])]
         [ON DELETE CASCADE],
   )[TABLESPACE ESPACIO_DE_TABLA];

Notas:
  • En la cláusula REFERENCES indicamos la tabla a la cual remite la clave ajena.
  • Hay que crear primero una tabla y después aquella que le hace referencia.
  • Hay que borrar primero la tabla que hace referencia a otra tabla y después la tabla que no hace referencia.
  • Borrado en cascada (ON DELETE CASCADE): Si borramos una fila de una tabla maestra, todas las filas de la tabla detalle cuya clave ajena sea referenciada se borraran automáticamente. La restricción se declara en la tabla detalle. El mensaje "n filas borradas" solo indica las filas borradas de la tabla maestra.

NOT NULL: Significa que la columna no puede tener valores nulos.
DEFAULT: Le proporcionamos a una columna un valor por defecto cuando el valor de la columna no se especifica en la cláusula INSERT. En la especificación DEFAULT es posible incluir varias expresiones: constantes, funciones SQL y variables UID y SYSDATE.
Verificación de restricciones: CHECK: Actúa como una cláusula where. Puede hacer referencia a una o más columnas, pero no a valores de otras filas. En una cláusula CHECK no se pueden incluir subconsultas ni las pseudoconsultas SYSDATE, UID y USER.
Nota: La restricción NOT NULL es similar a CHECK (NOMBRE_COLUMNA IS NOT NULL)



UNIQUE: Evita valores repetidos en la misma columna. Puede contener una o varias columnas. Es similar a la restricción PRIMARY KEY, salvo que son posibles varias columnas UNIQUE definidas en una tabla. Admite valores NULL. Al igual que en PRIMARY KEY, cuando se define una restricción UNIQUE se crea un índice automáticamente.
Vistas del diccionario de datos para las restricciones:
Contienen información general las siguientes:

USER_CONSTRAINTS: Definiciones de restricciones de tablas propiedad del usuario.
ALL_CONSTRAINTS: Definiciones de restricciones sobre tablas a las que puede acceder el usuario.
DBA_CONSTRAINTS: Todas las definiciones de restricciones sobre todas las tablas.

Creación de una tabla con datos recuperados en una consulta:
CREATE TABLE: permite crear una tabla a partir de la consulta de otra tabla ya existente. La nueva tabla contendrá los datos obtenidos en la consulta. Se lleva a cabo esta acción con la cláusula AS colocada al final de la orden CREATE TABLE.
   CREATE TABLE NOMBRETABLA
   (COLUMNA [,COLUMNA]
   )[TABLESPACE ESPACIO_DE_TABLA]
   AS CONSULTA;


No es necesario especificar tipos ni tamaño de las consultas, ya que vienen determinadas por los tipos y los tamaños de las recuperadas en la consulta.
La consulta puede tener una subconsulta, una combinación de tablas o cualquier sentencia select valida.
Las restricciones CON NOMBRE no se crean en una tabla desde la otra, solo se crean aquellas restricciones que carecen de nombre.