1. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
TEMA 3
LENGUAJE DE DEFINICIÓN DE DATOS (DDL)
1. Creación de tablas.
2. Modificación de tablas.
3. Borrado de tablas.
Prácticas de Diseño y Gestión de Bases de Datos Page 1 of 23
2. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
El lenguaje de definición de datos en SQL según vimos en el tema anterior se divide en
los siguientes comandos:
• CREATE TABLE
• ALTER TABLE
• DROP TABLE.
1. CREACIÓN DE UNA TABLA.
Una tabla se crea con la orden CREATE TABLE.
La sintáxis del comando CREATE TABLE es una sintáxis reducida del comando. Luego
veremos la sintáxis completa del comando CREATE TABLE. Por ahora para crear una
tabla tenemos suficiente con la siguiente.
Sintáxis
CREATE TABLE nombre_tabla
(nombre_columna tipo_dato [longitud][NOT NULL],
nombre_columna tipo_dato [longitude][NOT NULL],
…) [TABLESPACE espacio_de_tabla};
Con esto creamos la tabla dentro de nuestra base, le damos un nombre, y creamos su
estructura. Sólo queda introducer los datos.
Una vez que la tabla está creada su definición queda en el diccionario de datos.
a) Nombre de tabla
• Un nombre de tabla tiene una longitude maxima.
• Su nombre tiene que ser diferente a cualquier otra tabla o vista de la base
de de datos.
• El nombre de la tabla nunca podrá ser una palabra reservada de la base de
datos.
• Puede ser mayúsculas o minúsculas, es indiferente.
b) Definición de columnas
Cada columna de una tabla tendrá lo siguiente:
• Nombre del campo dentro de una tabla.
• Tipo de dato, con su longitude si es que procede y NOT NULL si ninca
puede estar vacío.
Prácticas de Diseño y Gestión de Bases de Datos Page 2 of 23
3. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
• La definición de cada columna va separada por ‘,’.
• El nombre de campo sigue las mismas reglas que el nombre de tabla, pero
las columnas pueden tener el mismo nombre si son tables distintas.
• Se pueden definer como máximo 254 columnas.
• Las claves primarias se deben definir como NOT NULL.
c) Reglas para la definición de los nombres
• Nombres únicos. Los nombres de las tables no pueden repetirse en una misma base
de datos. No pueden coincidir con una palabra clave.
• Caracteres. El primer caracter tiene que ser una letra. El resto de caracteres es libre,
pero sin ‘,’. El máximo es 30.
Según la sintáxis anterior vamos a crear las tablas en SQL*PLUS.
ESTRUCTURA DE NUESTRA BASE DE DATOS
• Ha llegado la hora de saber cómo va a estar organizada nuestra base de datos.
• Aunque al principio el siseño pueda parecer un poco complejo, veamos un gráfico
representativo de nuestra base de datos.
• Nuestra base de datos estará comprendida por las siguientes tablas:
o Clientes
o Tiendas
o Proveedores
o Articulos
o Ventas
Toda tabla tiene una clave primaria. La clave primaria es aquella que identifica a una sola
tupla (fila) de esa tabla. Representaremos los campos que son clave primaria con el
símbolo #.
Prácticas de Diseño y Gestión de Bases de Datos Page 3 of 23
4. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
Tabla Clientes:
#clt_num clt_apell clt_nom clt_pais clt_pob
• La tabla clientes lleva un número de identificación único no vacío (la clave
primaria clt_num), el apellido del cliente (clt_apell), su nombre (clt_nom),
nacionalidad (clt_pais) y su ciudad (clt_pob).
Tabla Tiendas:
#tda_num tda_pob tda_ger
• La tabla tiendas incluye un número de identificación único no vacío (la clave
primaria tda_num), el área geográfica en que se encuentra la tienda (tda_pob), y el
nombre del gerente (tda_ger).
Prácticas de Diseño y Gestión de Bases de Datos Page 4 of 23
5. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
Tabla Proveedores:
#prv_num prv_nom
• Contiene un número de identificación único, que es la clave primaria (prv_num),
y el nombre del proveedor (prv_nom). Existe un enlace funcional 1:N entre la
tabla proveedores y la tabla artículos, a través del número de proveedor que
aparece para cada artículo en la columna art_prv.
Tabla Articulos:
#art_num art_nom art_peso art_col art_pc art_pv art_prv
• Tiene un número de identificación único, la clave primaria (art_num), y contiene
además el nombre del artículo (art_nom), su peso (art_peso), su color (art_col), el
precio de compra (art_pc), el precio de venta (art_pv) y el número de proveedor
(art_prv), el cual hace de clave foránea para poderse relacionar con el número de
proveedores de la tabla proveedores.
Tabla Ventas:
#vnt_clt #vnt_tda #vnt_art vnt_cant vnt_precio #vnt_fch
• La tabla ventas es una tabla que crea dos enlaces, entre las tables tiendas y clients
por un lado, y clients y artículos por otro, lo que permite el seguimiento de los
artículos comprados por cada cliente y de las tiendas donde se efectuaron las
adquisiciones. La columna vnt_clt contiene el número de cliente, la columna
vnt_tda el número de tienda de adquisición y la comlumna vnt_art el número de
artículo adquirido. De igual modo, se memoriza la cantidad (vnt_cant), el precio
de venta (vnt_precio) y la fecha de venta (vnt_fch). Si un cliente compra varios
artículos se introducen en esta tabla tantas filas como artículos se han adquirido.
La clave primaria de la tabla se ha formado por la unión de cuatro claves foráneas,
que son vnt_clt, vnt_tda, vnt_art y vnt_fch. Esto significa, que un cliente no va a
comprar el mismo artículo en la misma tienda y en la misma fecha.
Prácticas de Diseño y Gestión de Bases de Datos Page 5 of 23
6. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
CREACIÓN DE LAS TABLAS DE NUESTRA BASE DE DATOS
• Creación de la tabla ‘clientes’
CREATE TABLE clientes (
clt_num INTEGER NOT NULL PRIMARY KEY,
clt_apell CHAR(10),
clt_nom CHAR(10),
clt_pais CHAR(1),
clt_pob CHAR(10)
);
La clave primaria de una tabla nunca puede estar vacía. Esto quiere decir que en la
definición de una tabla, siempre tendremos que poner NOT NULL en el campo que es
clave primaria.
Las claves primarias serán aquellas que nos permitirán relaccionar las filas de una tabla
con las filas de otra tabla.
• Creación de la tabla ‘tiendas’
CREATE TABLE tiendas (
tda_num INTEGER NOT NULL PRIMARY KEY,
tda_pob CHAR(15),
tda_ger CHAR(25)
);
• Creación de la tabla ‘proveedores’
CREATE TABLE proveedores (
prv_num integer NOT NULL PRIMARY KEY,
prv_nom CHAR(25)
);
• Creación de la tabla ‘articulos’
CREATE TABLE articulos (
art_num INTEGER NOT NULL PRIMARY KEY,
art_nom CHAR(20),
art_peso INTEGER,
art_col CHAR(10),
art_pc INTEGER,
art_pv INTEGER,
art_prv INTEGER
);
Prácticas de Diseño y Gestión de Bases de Datos Page 6 of 23
7. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
• Creación de la tabla ‘ventas’
CREATE TABLE ventas (
vnt_clt INTEGER NOT NULL,
vnt_tda INTEGER NOT NULL,
vnt_art INTEGER NOT NULL,
vnt_cant INTEGER NOT NULL,
vnt_precio INTEGER NOT NULL,
vnt_fch NUMBER(8)
);
Consideraciones generales:
a) Las definiciones individuales de columnas se separan mediante comas.
b) No se pone coma después de la última definición de columna.
c) Las mayúsculas y minúsculas son indiferentes a la hora de crear una tabla.
d) Si intentamos crear una tabla y existe otra tabla con ese nombre, aparecerá un
mensaje de error.
TIPOS DE DATOS EN ORACLE
Oracle soporta los siguientes tipos de datos:
TIPO DE DATO DEFINICIÓN
CHAR Cadena de caracteres de longitud fija. Máximo: 255.
VARCHAR2 Cadena de caracteres de longitud variable. Máximo: 2000.
NUMBER(p,s) Número entero y real hasta 38 dígitos. ‘p’ es el total de
dígitos(1..38) y ‘s’ es el número de decimales.
DATE Tipo de dato FECHA.
LONG Cadena de caracteres de longitud variable. Máximo: 2GB.
RAW Igual que el tipo VARCHAR2, pero en binario. 255 bytes.
LONG RAW Igual que LONG, pero en binario.
ROWID Tipo de dato int erno. No consideraremos.
NCHAR Oracle version 8. Parecido a CHAR.
NVARCHAR2 Oracle versión 8. Parecido a CHAR.
BLOB Oracle versión 8. Objeto binario de gran tamaño. 4GB.
1.1. INTEGRIDAD DE LOS DATOS.
• Cuando definimos una tabla existen varias condiciones predefinidas.
• Por ejemplo, si definimos la columna EDAD en una tabla, está claro que la edad
debe ser mayor que 0, nunca puede ser negativo.
• La integridad hace referencia a que los datos de la base de datos están sujetos a
unas restricciones antes de almacenarse en ella.
• Una restricción de integridad es una regla que restringe el rango de valores para
una o más columnas en la tabla.
Prácticas de Diseño y Gestión de Bases de Datos Page 7 of 23
8. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
• Existe otro tipo que es la integridad referencial, el cual garantiza que los valores
de una columna dependan de los valores de otra columna ( o columnas) de la
tabla. Por ejemplo si tuviesemos la tabla VENTA y la tabla ARTICULOS, nunca
podrá ocurrir que exista una venta de un artículo que no existe.
1.1.1. RESTRICCIONES EN CREATE TABLE.
• Para definir las restricciones en la orden CREATE TABLE usamos la cláusula
CONSTRAINT.
• La cláusula CONSTRAINT puede restringir a una sola columna o a un grupo de
columnas de una misma tabla.
• Hay dos formas de especificar las restricciones:
o Como parte de la definición de columnas
o Al final, una vez especificadas todas las columnas.
• Sintáxis:
CREATE TABLE nombre_tabla {
Columna1 TIPO_DE_DATO
[CONSTRAINT nombre_restricción]
[NOT NULL]
[UNIQUE]
[PRIMARY KEY]
[DEFAULT valor]
[REFERENCES nombre_tabla [(columna[, columna])]
[ON DELETE CASCADE]]
[CHECK condición],
Columna2 .....
) [TABLESAPCE espacio_de_tabla];
• Ejemplo:
CREATE TABLE EMPLEADO (
NOMBRE VARCHAR2(25) PRIMARY KEY,
EDAD NUMBER CHECK (EDAD BETWEEN 18 AND 35),
COD_PROVINCIA NUMBER(2) REFERENCES PROVINCIAS
ON DELETE CASCADE
En este ejemplo hemos creado una tabla donde:
a) La clave primaria es Nombre
b) Clave ajena: COD_PROVINCIA que referencia la tabla PROVINCIAS.
c) Verificación de la edad, que debe estar comprendida entre 18 y 35 años.
Las restricciones de la orden CREATE TABLE que aparecen al final de la definición
de columnas (o de tabla) se diferencia de la anterior en que se puede hacer referencias
a varias columnas en una única restricción.
Prácticas de Diseño y Gestión de Bases de Datos Page 8 of 23
9. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
Veamos un ejemplo:
SQL> CREATE TABLE EMPLEADO(
NOMBRE VARCHAR2(25),
EDAD NUMBER,
COD_PROVINCIA NUMBER(2),
CONSTRAINT PRIMARY KEY (NOMBRE)
CONSTRAINT CHECK(EDAD BETWEEN 18 AND 35),
CONSTRAINT FOREIGN KEY (COD_PROVINCIA)
REFERENCES PROVINCIAS ON DELETE CASCADE
);
1.1.1.1 Restricción PRIMARY KEY.
• Una clave primaria dentro de una tabla es una columna o conjunto de columnas
que identifican unívocamente a cada fila.
• Debe ser única, no nula y obligatoria. Cómo máximo podemos definir una clave
primaria por tabla.
• Esta clave primaria puede ser referenciada por una columna o columnas de otra
tabla. Esto será llamado clave ajena en la otra tabla.
• Cuando se crea una clave primaria automáticamente se crea un índice que facilita
el acceso a esa tabla.
• Para definir una clave primaria en una tabla usaremos la definición PRIMARY
KEY.
Formatos de la orden CREATE TABLE para definir las claves primarias:
• Sintáxis 1: Formato de restricción de columna
CREATE TABLE nombre_tabla(
Columna1 TIPO_DE_DATO (CONSTRAINT nombre_restricción) PRIMARY KEY,
Columna2 TIPO_DE_DATO
........
) [TABLESPACE espacio_de_tabla];
• Sintáxis 2: Formato de restricción de tabla
CREATE TABLE nombre_tabla(
Columna1 TIPO_DE_DATO
Columna2 TIPO_DE_DATO
........
[CONSTRAINT nombre_restricción) PRIMARY KEY (columna [,columna]),
........
) [TABLESPACE espacio_de_tabla];
Veamos un ejemplo:
Prácticas de Diseño y Gestión de Bases de Datos Page 9 of 23
10. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
Supongamos que tenemos la tabla BLOQUEPISOS.
NOMBRE COLUMNA Representa Tipo
CALLE Calle donde está el bloque VARCHAR2(30)
NUMERO Número del bloque NUMBER(3)
PISO Número de planta NUMBER(2)
PUERTA Puerta CHAR(1)
CODIGO_POSTAL Código Postal NUMBER(5)
METROS Metros de la vivienda NUMBER(5)
COMENTARIOS Otros datos de la vivienda VARCHAR2(60)
COD_ZONA Código de zona del bloque NUMBER(2)
DNI DNI del propietario VARCHAR2(10)
La clave primaria estará formada por las columnas Calle, Número, Piso y Puerta. Por
tanto no puden contener valores nulos. Se puede crear de la siguiente forma:
Vamos a crear el siguiente ejemplo usando la restricción de tabla
Ejemplo restriccion1
SQL> CREATE TABLE BLOQUEPISOS
(
CALLE VARCHAR2(30) NOT NULL,
NUMERO NUMBER(3) NOT NULL,
PISO NUMBER(2) NOT NULL,
PUERTA CHAR(1) NOT NULL,
CODIGO_POSTAL NUMBER(5),
METROS NUMBER(5),
COMENTARIOS VARCHAR2(60),
COD_ZONA NUMBER(2),
DNI VARCHAR2(10),
CONSTRAINT pk_viv PRIMARY KEY (calle, numero, piso, puerta)
);
Ahora borramos la tabla con la orden DROP que veremos mas adelante.
SQL> DROP TABLE BLOQUEPISOS;
Table dropped
Y la creamos de la siguente forma (Fichero restriccion2)
SQL>CREATE TABLE BLOQUEPISOS
(
CALLE VARCHAR2(30) NOT NULL,
NUMERO NUMBER(3) NOT NULL,
PISO NUMBER(2) NOT NULL,
PUERTA CHAR(1) NOT NULL,
CODIGO_POSTAL NUMBER(5),
METROS NUMBER(5),
COMENTARIOS VARCHAR2(60),
COD_ZONA NUMBER(2),
DNI VARCHAR2(10),
PRIMARY KEY (calle, numero, piso, puerta)
);
SQL> DROP TABLE BLOQUEPISOS;
Prácticas de Diseño y Gestión de Bases de Datos Page 10 of 23
11. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
Suponga mos ahora que tenemos la tabla siguiente llamada ZONAS:
NOMBRE COLUMNA Representa Tipo
COD_ZONA Código de la zona NUMBER(3)
NOMBREZONA Nombre de la zona VARCHAR2(20)
MASDATOS Otros datos de la zona VARCHAR2(50)
La clave primaria es el código de zona y la definimos formando parte de la columna
(Restricción de columna)
Fichero zonas
SQL>CREATE TABLE ZONAS
(
COD_ZONAS NUMBER(3) PRIMARY KEY,
NOMBREZONA VARCHAR2(15) NOT NULL,
MASDATOS VARCHAR2(60)
);
SQL> DROP TABLE ZONAS;
Si en una tabla forman parte de la clave primaria varias columnas, ésta no se puede
definir como restricción de columna. No podríamos hacer lo siguiente:
SQL> CREATE TABLE BLOQUEPISOS
(
CALLE VARCHAR2(30) PRIMARY KEY,
NUMERO NUMBER(3) PRIMARY KEY,
PISO NUMBER(2) PRIMARY KEY,
PUERTA CHAR(1) PRIMARY KEY,
CODIGO_POSTAL NUMBER(5),
METROS NUMBER(5),
COMENTARIOS VARCHAR2(60),
COD_ZONA NUMBER(2),
DNI VARCHAR2(10),
);
NUMERO NUMBER(3) PRIMARY KEY,
*
ERROR en línea 4:
ORA-02260: la tabla sólo puede tener una clave primaria
1.1.1.2. Restricción FOREIGN KEY.
• Una clave ajena está 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 sea necesario, y pueden estar en la
misma tabla que la clave primaria.
• El valor de la columna o columnas que son claves ajenas debe ser:
o NULL
o O igual a un valor de la clave referenciada (Integridad referencial).
Prácticas de Diseño y Gestión de Bases de Datos Page 11 of 23
12. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
• Para entender el significado de claves primarias y claves ajenas veamos el
siguiente gráfico:
En estas tablas tenemos:
• Clave primaria de la tabla PERSONAS: DNI.
• Clave primaria de la tabla PROVINCIAS: COD_PROV.
• Clave ajena en la tabla PERSONAS: COD_PROV.
Esto implica que las tablas PERSONAS y PROVINCIAS están relacionadas a través del
atributo COD_PROV.
Vamos a crear estas dos tablas con sus relaciones.
Fichero ajenas.
CREATE TABLE PROVINCIAS (
COD_PROV NUMBER(2) PRIMARY KEY,
NOM_PROV VARCHAR2(15)
);
CREATE TABLE PERSONAS (
DNI NUMBER(8) PRIMARY KEY,
NOMBRE VARCHAR2(15),
DIRECCION VARCHAR2(25),
POBLACION VARCHAR2(20),
COD_PROV NUMBER(2) NOT NULL REFERENCES PROVINCIAS
);
Si ahora intentamos borrar la tabla PROVINCIAS:
SQL> DROP TABLE PROVINCIAS;
DROP TABLE PROVINCIAS
*
ERROR at line 1:
ORA-02449: unique/primary keys in table referenced by foreign keys
• Tenemos que crear primero la tabla PROVINCIAS y luego la tabla PERSONAS,
ya que la segunda tabla hace referencia a la primera tabla .
• Si queremos borrar las tablas, comenzaremos borrando la tabla PERSONAS, y
después, la tabla PROVINCIAS. Si intentamos hacerlo al revés se emitirá un
mensaje como el de arriba.
Prácticas de Diseño y Gestión de Bases de Datos Page 12 of 23
13. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
SQL> DROP TABLE PERSONAS;
Table dropped.
SQL> DROP TABLE PROVINCIAS;
Table dropped.
Formatos de la orden CREATE TABLE para definir las claves ajenas:
• Sintáxis 1: Formato de restricción de columna
CREATE TABLE nombre_tabla
columna1 TIPO_DE_DATO
[CONSTRAINT nombre_restricción]
REFERENCES nombre_tabla2 [(columna)] [ON DELETE CASCADE]
.........
columna2 TIPO_DE_DATO
........
) [TABLESPACE espacio_de_tabla];
• Sintáxis 2: Formato de restricción de tabla
CREATE TABLE nombre_tabla
columna1 TIPO_DE_DATO
columna2 TIPO_DE_DATO
..................
[CONSTRAINT nombre_restricción]
FOREIGN KEY (columna [, columna])
REFERENCES nombre_tabla2 [(columna [,columna])]
[ON DELETE CASCADE]
.........
) [TABLESPACE espacio_de_tabla];
Si lo que deseamos es borrar alguna provincia de la tabla PROVINCIAS, y que las filas
correspondientes de la tabla PERSONAS con esa provincia sean eliminadas, se añadirá la
cláusula ON DELETE CASCADE en la opción REFERENCES:
Fichero cascada
CREATE TABLE PROVINCIAS (
COD_PROV NUMBER(2) PRIMARY KEY,
NOM_PROV VARCHAR2(15)
);
CREATE TABLE PERSONAS (
DNI NUMBER(8) PRIMARY KEY,
NOMBRE VARCHAR2(15),
DIRECCION VARCHAR2(25),
POBLACION VARCHAR2(20),
COD_PROV NUMBER(2) NOT NULL,
FOREIGN KEY (COD_PROV) REFERENCES PROVINCIAS
ON DELETE CASCADE
);
Prácticas de Diseño y Gestión de Bases de Datos Page 13 of 23
14. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
SQL> DROP TABLE PERSONAS;
Table dropped
SQL> DROP TABLE PROVINCIAS;
Table dropped
• En los ejemplos anteriores al definir las restricciones de claves primarias y ajenas
no hemos dado nombre (excepto en el ejemplo restriccion1).
• Por defecto Oracle asigna un nombre de restricción SYS_C00n, donde ‘n’ es un
número asignado automáticamente por Oracle.
• Cuando una restricción es violada Oracle emite un mensaje de error. El mesaje de
error es algo parecido a lo siguiente:
ERROR en línea 1:
ORA-00001: restricción única (Valor.SYS_C00679) violada.
Valor es el contenido de un campo.
A continuación vamos a crear las restricciones dándole nombres:
Fichero restrinombre
CREATE TABLE PROVINCIAS (
COD_PROV NUMBER(2)
CONSTRAINT PK_PROV PRIMARY KEY,
NOM_PROV VARCHAR2(15)
);
CREATE TABLE PERSONAS (
DNI NUMBER(8)
CONSTRAINT PK_PER PRIMARY KEY,
NOMBRE VARCHAR2(15),
DIRECCION VARCHAR2(25),
POBLACION VARCHAR2(20),
COD_PROV NUMBER(2) NOT NULL,
CONSTRAINT FK_PER FOREIGN KEY (COD_PROV) REFERENCES PROVINCIAS
ON DELETE CASCADE
);
PK_PROV: Nombre de la restriccion de Primary Key en PROVEEDORE.
PK_PER: Nombre de la restriccion de Primary Key en PERSONAS.
FK_PER: Nombre de la restriccion de Foreign Key en PERSONAS
SQL> DROP TABLE PERSONAS;
Table dropped.
SQL> DROP TABLE PROVINCIAS;
Table dropped.
Prácticas de Diseño y Gestión de Bases de Datos Page 14 of 23
15. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
Especificación DEFAULT
• En el momento de crear una tabla podemos designar valores por defecto en las
columnas.
• Si especificamos la cláusula DEFAULT a una columna, le proporcionamos un
valor por omisión cuando el valor de la columna no se especifica en la cláusula
INSERT.
• INSERT es la cláusula de inserción de datos.
• En la cláusula DEFAULT es posible incluir varias expresiones: constantes,
funciones SQL y variables UID y SYSDATE.
Veamos algunos ejemplos.
• Creemos la tabla EJEMPLO1 y se le asigna a la columna FECHA la fecha del
sistema.
Fichero ejemplo1
SQL>CREATE TABLE EJEMPLO1 (
DNI VARCHAR2(10) NOT NULL,
NOMBRE VARCHAR2(30) NOT NULL,
EDAD NUMBER(2),
FECHA DATE DEFAULT SYSDATE
);
Table created
SQL> DROP TABLE EJEMPLO1;
Table dropped
• Cuando vayamos a insertar valores de una fila en la tabla no es necesario insertar
el valor de la columna FECHA, ya que tomará por defecto la fecha del día.
Vamos a crear la tabla EJEMPLO2 y asignamos por defecto a la columna NOMBRE
la cadena ‘No definido’ y a la columna USUARIO, el número identificativo del
usuario.
Fichero ejemplo2
SQL> CREATE TABLE EJEMPLO2 (
DNI VARCHAR2(10) NOT NULL,
NOMBRE VARCHAR2(30) DEFAULT 'No definido',
USUARIO NUMBER DEFAULT UID);
Prácticas de Diseño y Gestión de Bases de Datos Page 15 of 23
16. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
1.1.1.3. Restricción CHECK.
• Muchas columnas de tablas requieren valores limitados dentro de un rango o el
cumplimiento de ciertas condiciones.
• Con una restricción de verificación de condiciones se puede expresar una
condición que ha de cumplirse para todas y cada una de las filas de la tabla.
• La restricción CHECK actúa como la cláusula WHERE.
• En la cláusula CHECK no cabe incluir subconsultas ni las pseudocolumnas
SYSDATE, UID, USER.
• Sintáxis 1: Formato de restricción de columna
CREATE TABLE nombre_tabla
columna1 TIPO_DE_DATO
[CONSTRAINT nombre_restricción] CHECK (condición),
.........
columna2 TIPO_DE_DATO
........
) [TABLESPACE espacio_de_tabla];
• Sintáxis 2: Formato de restricción de tabla
CREATE TABLE nombre_tabla
columna1 TIPO_DE_DATO
columna2 TIPO_DE_DATO
..................
[CONSTRAINT nombre_restricción] CHECK (condición)
.........
) [TABLESPACE espacio_de_tabla];
Ejemplos.
Se desea crear la tabla EJEMPLOS, cuyas columnas y restricciones son:
Columna Tipo de Dato
DNI VARCHAR2(10)
NOMBRE VARCHAR2(30)
EDAD NUMBER(2)
CURSO NUMBER
Condiciones:
a) DNI no puede ser nulo.
b) La clave primaria es el DNI.
c) El NOMBRE no puede ser nulo.
Prácticas de Diseño y Gestión de Bases de Datos Page 16 of 23
17. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
d) La EDAD ha de estar comprend ida entre 5 y 20 años.
e) El NOMBRE ha de estar en mayúsculas.
f) El CURSO sólo puede almacenar1,2, ó 3.
SQL>CREATE TABLE EJEMPLO
(
DNI VARCHAR2(10) NOT NULL,
NOMBRE VARCHAR2(30) NOT NULL,
EDAD NUMBER(2),
CURSO NUMBER,
CONSTRAINT CLAVE_P PRIMARY KEY(DNI),
CONSTRAINT COMP_EDAD CHECK (EDAD BETWEEN 5 AND 20),
CONSTRAINT NOMBRE_MAYUS CHECK (NOMBRE=UPPER(NOMBRE)),
CONSTRAINT COMP_CURSO CHECK (CURSO IN(1,2,3))
);
1.1.1.4. Restricción UNIQUE.
• La restricción 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 con PRIMARY KEY, cuando se define la restricción UNIQUE se
crea un índice automáticamente.
• Sintáxis 1: Formato de restricción de columna
CREATE TABLE nombre_tabla
columna1 TIPO_DE_DATO
[CONSTRAINT nombre_restricción] UNIQUE,
.........
columna2 TIPO_DE_DATO
........
) [TABLESPACE espacio_de_tabla];
• Sintáxis 2: Formato de restricción de tabla
CREATE TABLE nombre_tabla
columna1 TIPO_DE_DATO
columna2 TIPO_DE_DATO
..................
[CONSTRAINT nombre_restricción] UNIQUE (columna[, columna]),
.........
) [TABLESPACE espacio_de_tabla];
Prácticas de Diseño y Gestión de Bases de Datos Page 17 of 23
18. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
2. ALTER TABLE.
2.1. ADICIÓN DE UNA COLUMNA A UNA TABLA
Las tablas se pueden modificar de dos formas:
a) Cambiando la definición de una columna (MODIFY).
b) Añadiendo una columna a una tabla existente (ADD).
Sintáxis
ALTER TABLE nombre_tabla ADD
(columna tipo_dato [, columna tipo_datos]);
• Un error típico es intentar añadir una columna con la restricción NOT NULL. Si
la tabla está vacía no hay problemas, pero si no es así no podremos poner la
restricción NOT NULL.
• Una solución a esto es crear la columna sin poner la restricciones, y luego
actualizar las filas correspondientes de la tabla. Se realizará con la sentencia
UPDATE que veremos más adelante.
2.2. MODIFICACIÓN DE LA DEFINICIÓN DE UNA COLUMNA.
La modificación de un campo de una tabla puede ser debido a:
a) Deseemos incrementar la anchura.
b) Deseemos especificar una anchura o mascara para opciones numéricas
c) Si una columna contiene valores, podemos modificar su definición y que sea NOT
NULL.
d) Si queremos acortar una columna, tiene que estar libre de datos. Hay que hacer
estas modificaciones cuando no hay datos en la columna especificada.
e) Para cambiar el tipo de datos también tiene que estar vacía.
Sintáxis
ALTER TABLE nombre_tabla
MODIFY (columna, …);
RESUMEN DE ALTER TABLE
• La sintáxis de ALTER TABLE es la siguiente:
Sintáxis
ALTER TABLE nombre_tabla
{[ADD (columna [,columna]...)]
[MODIFY (columna [,columna]....)]
[ADD CONSTRAINT restricción]
[DROP CONSTRAINT restricción]);
Prácticas de Diseño y Gestión de Bases de Datos Page 18 of 23
19. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
• ADD añade una columna o más al final de la tabla.
• MODIFY modifica una o más columnas existentes en la tabla.
• ADD CONSTRAINT añade una restricción a la definición de la tabla.
• DROP CONSTRAINT elimina una restricción de la tabla.
Veamos algunos ejemplos.
• Añadir a la tabla ejemplo dos columnas SEXO e IMPORTE. La descripción de la
tabla ejemplo es la siguiente:
SQL> DESC EJEMPLO;
Name Null? Type
DNI NOT NULL VARCHAR2(10)
NOMBRE NOT NULL VARCHAR2(30)
EDAD NUMBER(2)
CURSO NUMBER
Para añadir esas dos columnas a la tabla usamos la orden ADD.
SQL > ALTER TABLE EJEMPLO ADD (SEXO CHAR(1), IMPORTE NUMBER(4));
Tabla modificada.
SQL> DESC EJEMPLO;
Name Null? Type
DNI NOT NULL VARCHAR2(10)
NOMBRE NOT NULL VARCHAR2(30)
EDAD NUMBER(2)
CURSO NUMBER
SEXO CHAR(1)
IMPORTE NUMBER(4)
Si hubiesemos querido añadir la restricción NOT NULL a la columna SEXO hubiesemos
escrito:
SQL > ALTER TABLE EJEMPLO ADD (SEXO CHAR(1) NOT NULL, IMPORTE NUMBER(4));
Esto nos podría dar el siguiente error:
ALTER TABLE EJEMPLO ADD(
*
ERROR en línea 1:
ORA-01758: La tabla debe estar vacía para añadir columna (NOT NULL) obligatoria.
Este error ha aparecido porque la tabla EJEMPLO ya contiene datos.
La solución pasaría por usar la orden ALTER TABLE sin el NOT NULL, y luego
haciendo un UPDATE de esa columna.
Prácticas de Diseño y Gestión de Bases de Datos Page 19 of 23
20. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
SQL> ALTER TABLE EJEMPLO ADD (SEXO CHAR(1), IMPORTE NUMBER(4));
Tabla modificada.
SQL> UPDATE EJEMPLO SET SEXO=’X’;
Esta segunda orden la veremos más adelante. Para entender ahora qué es lo que hace
internamente es “actualizar todas las filas de la tabla de la columna SEXO con la letra
‘X’. En el siguiente gráfico podemos ver qué actualiza.
DNI NOMBRE EDAD CURSO SEXO IMPORTE
X
X
X
A continuación vamos a modificar la tabla con la orden MODIFY y se cambia la
definición de la columna a NOT NULL:
SQL> ALTER TABLE EJEMPLO MODIFY(
SEXO CHAR(1) NOT NULL,
IMPORTE NUMBER(4)
);
Tabla modificada.
SQL> DESC EJEMPLO;
Name Null? Type
DNI NOT NULL VARCHAR2(10)
NOMBRE NOT NULL VARCHAR2(30)
EDAD NUMBER(2)
CURSO NUMBER
SEXO NOT NULL CHAR(1)
IMPORTE NUMBER(4)
En definitiva, a la hora de añadir una columna a una tabla hay que tener en cuenta varios
factores:
a) Si la columna no está definida como NOT NULL, se le puede añadir en cualquier
momento.
b) Si la columna está definida como NOT NULL puede ocurrir 2 situaciones:
a. Que la tabla esté vacía, en cuyo caso no hay problema.
b. Que la tabla no esté vacía, entonces:
i. Definirla sin NOT NULL.
ii. Actualizar las filas correspondientes.
iii. Modificar la columna a NOT NULL.
Prácticas de Diseño y Gestión de Bases de Datos Page 20 of 23
21. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
A continuación vamos a modificar la longitud de la columna NOMBRE de la tabla
ejemplo. Tambié n vamos a dar una longitud 3 y, por defecto, se asigna 0 al IMPORTE.
SQL> ALTER TABLE EJEMPLO MODIFY (
NOMBRE VARCHAR2(3),
IMPORTE DEFAULT 0);
Dará el siguiente error:
NOMBRE VARCHAR2(3),
*
ERROR en línea 2:
ORA-01441: La columna a modificar debe estar vacía para disminuir la longitud de la columna.
Si ahora escribimos:
SQL>ALTER TABLE EJEMPLO MODIFY (NOMBRE VARCHAR2(35));
Tabla modificada.
Al modificar una columna de una tabla se han de tener en cuenta estos aspectos:
- Se puede aumentar la longitiud de una columna en cualquier momento.
- Es posible aumentar o disminuir el número de posicio nes decimales en una columna
de tipo NUMBER.
- Si la columna es NULL en todas las filas de la tabla, se puede disminuir la longitud y
modificar el tipo de dato.
- La opción MODIFY...NOT NULL sólo será posible cuando la tabla no contenga
ninguna fila con valor nulo en la columna que se modifica.
2.2.1. AÑADIR RESTRICCIONES.
Con la orden ALTER TABLE se pueden añadir restricciones a una TABLA.
Sintáxis:
ALTER TABLE nombre_tabla
ADD CONSTRAINT nombreconstraint
Veamos algunos ejemplos.
Añadimos APELLIDO único a la tabla EMPLE:
SQL> ALTER TABLE EMPLE ADD CONSTRAINT APELLIDO_UQ UNIQUE(apellido);
Tabla modificada.
Añadimos la restricción de COMISION no nula a la tabla EMPLE:
SQL> ALTER TABLE EMPLE ADD CONSTRAINT COMI_NONULA CHECK(COMISION IS NOT NULL);
check(COMISION IS NOT NULL)
*
ERROR en línea 3:
ORA-02293: no se ha podido activar (MAJESUS.COMI_NONULA) – compruebe restricción de violada
Prácticas de Diseño y Gestión de Bases de Datos Page 21 of 23
22. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
Este error es debido a que la columna COMISION es nula en muchas filas de la tabla.
Para añadir la restricción es necesario dar valores a todas las filas de la tabla.
Para ver las restricciones creadas tenemos que seleccionar la columna
CONSTRAINT_NAME de la tabla USER_CONSTRAINTS
SQL> SELECT CONSTRAINT_NAME FROM USER_COSNTRAINTS WHERE TABLE_NAME=’EMPLE’;
2.2.2. BORRADO DE RESTRICCIONES.
Sintáxis
ALTER TABLE nombre_tabla
DROP CONSTRAINT nombre_constraint...;
Nombre_restricción;
Ejemplo: Borrar la restricción APELLIDO_UQ de la tabla EMPLE.
SQL> ALTER TABLE EMPLE DROP CONSTRAINT APELLIDO_UQ;
Tabla modificada.
CREACIÓN DE TABLAS CON DATOS RECUPERADOS DE UNA CONSULTA.
• La sentencia CREATE TABLE permite crear una tabla a partir de la consulta de
otra tabla existente.
Sintáxis
CREATE TABLE nombre_tabla
(
.....
)
[TABLESPACE espacio_de_tabla]
AS consulta;
Ejemplo.
SQL> CREATE TABLE EJEMPLO_AS SELECT * FROM EJEMPLO;
• No es necesario especificar tipos ni tamaño de las columnas, ya que vienen
determinados por los tipos y tamaños de las recuperadas en la consulta.
Prácticas de Diseño y Gestión de Bases de Datos Page 22 of 23
23. Formación 2002. Tema 3. Lenguaje de Definición de Datos (DDL)
3. BORRADO DE TABLAS.
3.1. DROP TABLE.
• La orden DROP TABLE suprime una tabla de la base de datos.
• Cada usuario puede borrar sus propias tablas.
• Sólo el administrador de la base de datos o algún usario con el privilegio DROP
ANY TABLE puede borrar las tablas de otro usuario,
• Al suprimir una tabla también se suprimen los índices y los pirvilegios asociados a
ella.
• Las vistas y los sinónimos creados a partir de esa tabla dejan de funcionar, pero
siguen existiendo en la base de datos, por lo que habría que eliminarlos.
• Sintáxis:
DROP TABLE [usuario].nombre_table [CASCADE CONSTRAINTS];
3.2. TRUNCATE TABLE.
• La orden TRUNCATE permite suprimir todas las filas de una tabla y liberar el epacio
ocupado para otros usos sin que desaparezca la definición de la tabla de la base de
datos.
• La eliminación de filas con la orden TRUNCATE es más rápida que con DELETE.
• Sintáxis:
TRUNCATE TABLE [usuario.]nombre_table [{DROP|REUSE} STORAGE];
• No se puede truncar una tabla cuya clave primaria sera referenciada por la clave ajena
de otra tabla. Antes de truncar la tabla hay que desactivar la restricción. (Ejemplo de
la tabla PROVINCIAS vista anteriormente).
Prácticas de Diseño y Gestión de Bases de Datos Page 23 of 23