Parte 5 Actualización de Datos

Descargar como doc, pdf o txt
Descargar como doc, pdf o txt
Está en la página 1de 15

Actualización de datos

Introducción

Hasta ahora hemos estudiado el cómo recuperar datos almacenados en las tablas de nuestra base de
datos. En este tema vamos a tratar el de la actualización de esos datos, es decir insertar nuevas filas,
borrar filas o cambiar el contenido de las filas de una tabla. Estas operaciones modifican los datos
almacenados en las tablas pero no su estructura, ni su definición.
Empezaremos por ver cómo insertar nuevas filas (con la sentencia INSERT INTO), veremos una variante
(la sentencia SELECT... INTO), después veremos cómo borrar filas de una tabla (con la sentencia DELETE)
y por último cómo modificar el contenido de las filas de una tabla (con la sentencia UPDATE). Si trabajamos
en un entorno multiusuario, todas estas operaciones se podrán realizar siempre que tengamos los
permisos correspondientes.

Insertar una fila INSERT INTO...VALUES


La inserción de nuevos datos en una tabla se realiza añadiendo filas enteras a la tabla, la sentencia
SQL que lo permite es la orden INSERT INTO.
La inserción se puede realizar de una fila o de varias filas de golpe, veremos las dos opciones por
separado y empezaremos por la inserción de una fila.
La sintaxis es la siguiente:

Esta sintaxis se utiliza para insertar una sola fila cuyos valores indicamos después de la palabra reservada
VALUES. En castellano la sentencia se leería: INSERTA EN destino...VALORES ....
Los registros se agregan siempre al final de la tabla.
Destino es el nombre de la tabla donde vamos a insertar la fila también se puede utilizar un nombre de
consulta, consulta que tenga como origen de datos una única tabla. Al nombre de la tabla se le puede
añadir la cláusula IN si la tabla se encuentra en otra base de datos (en una base de datos externa).
La palabra reservada VALUES se puede sustituir por la palabra SELECT ( en otros SQLs se emplea
únicamente VALUES).
A continuación de la palabra VALUES, entre paréntesis se escriben los valores que queremos añadir.
Estos valores se tienen que escribir de acuerdo al tipo de dato de la columna donde se van a insertar
(encerrados entre comillas simples ' ' para valores de tipo texto, entre # # para valores de fecha...) la
asignación de valores se realiza por posición, el primer valor lo asigna a la primera columna, el segundo
valor a la segunda columna, así sucesivamente...
Cuando la tabla tiene una columna de tipo contador (AutoNumber), lo normal es no asignar valor a esa
columna para que el sistema le asigne el valor que le toque según el contador, si por el contrario queremos
que la columna tenga un valor concreto, lo indicamos en la lista de valores.
Cuando no se indica ninguna lista de columnas después del destino, se asume por defecto todas las
columnas de la tabla, en este caso, los valores se tienen que especificar en el mismo orden en que
aparecen las columnas en la ventana de diseño de dicha tabla, y se tiene que utilizar el valor NULL para
rellenar las columnas de las cuales no tenemos valores.
Ejemplo:
INSERT INTO empleados VALUES (200, 'Juan López', 30, NULL, 'rep ventas', #06/23/01#, NULL,
350000, 0)
Observar en el ejemplo que los valores de tipo texto se encierran entre comillas simples ' ' (también se
pueden emplear las comillas dobles " ") y que la fecha de contrato se encierra entre almohadillas # # con el
formato mes/dia/año. Como no tenemos valor para los campos oficina y director (a este nuevo empleado
todavía no se le ha asignado director ni oficina) utilizamos la palabra reservada NULL. Los valores
numéricos se escriben tal cual, para separar la parte entera de la parte decimal hay que utilizar siempre el
punto independientemente de la configuración que tengamos.
Cuando indicamos nombres de columnas, estos corresponden a nombres de columna de la tabla,
pero no tienen por qué estar en el orden en que aparecen en la ventana diseño de la tabla, también se
pueden omitir algunas columnas, la columnas que no se nombran tendrán por defecto el valor NULL o
el valor predeterminado indicado en la ventana de diseño de tabla.
El ejemplo anterior se podría escribir de la siguiente forma:

INSERT INTO empleados (numemp,oficina, nombre, titulo,cuota, contrato, ventas)


VALUES (200, 30, 'Juan López', 'rep ventas',350000, #06/23/01#,0)
Observar que ahora hemos variado el orden de los valores y los nombres de columna no siguen el mismo
orden que en la tabla origen, no importa, lo importante es poner los valores en el mismo orden que las
columnas que enunciamos. Como no enunciamos las columnas oficina y director se rellenarán con el valor
nulo (porque es el valor que tienen esas columnas como valor predeterminado).
El utilizar la opción de poner una lista de columnas podría parecer peor ya que se tiene que escribir más
pero realmente tiene ventajas sobre todo cuando la sentencia la vamos a almacenar y reutilizar:

la sentencia queda más fácil de interpretar leyéndola vemos qué valor asignamos a qué columna,

de paso nos aseguramos que el valor lo asignamos a la columna que queremos,

si por lo que sea cambia el orden de las columnas en la tabla en el diseño, no pasaría nada mientras que
de la otra forma intentaría asignar los valores a otra columna, esto produciría errores de 'tipo no corresponde'
y lo que es peor podría asignar valores erróneos sin que nos demos cuenta,

otra ventaja es que si se añade una nueva columna a la tabla en el diseño, la primera sentencia INSERT
daría error ya que el número de valores no corresponde con el número de columnas de la tabla, mientras
que la segunda INSERT no daría error y en la nueva columna se insertaría el valor predeterminado. 
Errores que se pueden producir cuando se ejecuta la sentencia INSERT INTO:

Si la tabla de destino tiene clave principal y en ese campo intentamos no asignar valor, asignar el valor
nulo o un valor que ya existe en la tabla, el motor de base de datos Microsoft Jet no añade la fila y da un
mensaje de error de 'infracciones de clave'.

Si tenemos definido un índice único (sin duplicados) e intentamos asignar un valor que ya existe en la tabla
también devuelve el mismo error.

Insertar varias filas INSERT INTO...SELECT

Podemos insertar en una tabla varias filas con una sola sentencia SELECT INTO si los valores a
insertar se pueden obtener como resultado de una consulta, en este caso sustituimos la cláusula VALUES
lista de valores por una sentencia SELECT como las que hemos visto hasta ahora. Cada fila resultado de
la SELECT forma una lista de valores que son los que se insertan en una nueva fila de la tabla destino. Es
como si tuviesemos una INSERT...VALUES por cada fila resultado de la sentencia SELECT.
La sintaxis es la siguiente:

El origen de la SELECT puede ser el nombre de una consulta guardada, un nombre de tabla o una
composición de varias tablas ( mediante INNER JOIN, LEFT JOIN, RIGHT JOIN o producto cartesiano).
Cada fila devuelta por la SELECT actúa como la lista de valores que vimos con la INSERT...VALUES
por lo que tiene las mismas restricciones en cuanto a tipo de dato, etc. La asignación de valores se
realiza por posición por lo que la SELECT debe devolver el mismo número de columnas que las de la
tabla destino y en el mismo orden, o el mismo número de columnas que indicamos en la lista de columnas
después de destino.
Las columnas de la SELECT no tienen porque llamarse igual que en la tabla destino ya que el sistema
sólo se fija en los valores devueltos por la SELECT.
Si no queremos asignar valores a todas las columnas entonces tenemos que indicar entre paréntesis
la lista de columnas a rellenar después del nombre del destino.
El estándar ANSI/ISO especifica varias restricciones sobre la consulta que aparece dentro de la
sentencia INSERT:

la consulta no puede tener una cláusula ORDER BY,


la tabla destino de la sentencia INSERT no puede aparecer en la cláusula FROM de la consulta o de ninguna
subconsulta que ésta tenga. Esto prohibe insertar parte de una tabla en sí misma,

la consulta no puede ser la UNION de varias sentencias SELECT diferentes,

el resultado de la consulta debe contener el mismo número de columnas que las indicadas para insertar y los
tipos de datos deben ser compatibles columna a columna.

Sin embargo en SQL de Microsoft Jet,


se puede incluir la cláusula ORDER BY aunque no tiene mucho sentido.
se puede poner en la cláusula FROM de la consulta, la tabla en la que vamos a insertar,
pero no podemos utilizar una UNION.

Ejemplo: Supongamos que tenemos una tabla llamada repres con la misma estructura que la tabla
empleados, y queremos insertar en esa tabla los empleados que tengan como titulo rep ventas

INSERT INTO repres SELECT * FROM empleados WHERE titulo = 'rep ventas'

Con la SELECT obtenemos las filas correspondientes a los empleados con título rep ventas,y las
insertamos en la tabla repres. Como las tablas tienen la misma estructura no hace falta poner la lista de
columnas y podemos emplear * en la lista de selección de la SELECT.

Ejemplo: Supongamos ahora que la tabla repres tuviese las siguientes columnas numemp, oficinarep,
nombrerep. En este caso no podríamos utilizar el asterisco, tendríamos que poner:

INSERT INTO repres SELECT numemp, oficina, nombre FROM empleados WHERE titulo = 'rep ventas'

O bien:

INSERT INTO repres (numemp, oficinarep, nombrerep) SELECT numemp, oficina, nombre FROM
empleados WHERE titulo = 'rep ventas'

Insertar filas en una nueva tabla SELECT ... INTO


Esta sentencia inserta filas creando en ese momento la tabla donde se insertan las filas. Se suele
utilizar para guardar en una tabla el resultado de una SELECT.
La sintaxis es la siguiente:

Las columnas de la nueva tabla tendrán el mismo tipo y tamaño que las columnas origen, y se
llamarán con el nombre de alias de la columna origen o en su defecto con el nombre de la columna
origen, pero no se transfiere ninguna otra propiedad del campo o de la tabla como por ejemplo las
claves e índices.
La sentencia SELECT puede ser cualquier sentencia SELECT sin ninguna restricción, puede ser una
consulta multitabla, una consulta de resumen, una UNION ...

Ejemplo:

SELECT * INTO t2 FROM t1 (no funciona)


insert into ….. select ---
create table kk select * from

Esta sentencia genera una nueva tabla t2 con todas las filas de la tabla t1. Las columnas se llamarán igual
que en t1 pero t2 no será una copia exacta de t1 ya no tendrá clave principal ni relaciones con las otras
tablas, ni índices si los tuviese t1 etc...
Si en la base de datos hay ya una tabla del mismo nombre, el sistema nos avisa y nos pregunta si la
queremos borrar. Si le contestamos que no, la SELECT no se ejecuta.
Para formar una sentencia SELECT INTO lo mejor es escribir la SELECT que permite generar los
datos que queremos guardar en la nueva tabla, y después añadir delante de la cláusula FROM la cláusula
INTO nuevatabla.
La sentencia SELECT INTO se suele utilizar para crear tablas de trabajo, o tablas intermedias, las
creamos para una determinada tarea y cuando hemos terminado esa tarea las borramos. También puede ser
útil para sacar datos en una tabla para enviarlos a alguien.
Por ejemplo: Queremos enviarle a un representante una tabla con todos los datos personales de sus
clientes para que les pueda enviar cartas etc...

SELECT numclie AS codigo, nombre, direccion, telefono INTO susclientes FROM clientes WHERE
repclie = '103';

Vamos a suponer que hemos añadido a nuestra tabla de clientes los campos direccion y telefono. En el
ejemplo anterior la nueva tabla tendrá cuatro columnas llamadas codigo, nombre, direccion, telefono y
contendrá las filas correspondientes a los clientes del representante 103.

Modificar el contenido de las filas ( UPDATE )


La sentencia UPDATE modifica los valores de una o más columnas en las filas seleccionadas de
una o varias tablas.
La sintaxis es la siguiente:

Origen puede ser un nombre de tabla, un nombre de consulta o una composición de tablas, también
puede incluir la cláusula IN si la tabla a modificar se encuentra en una base de datos externa.

La cláusula SET especifica qué columnas van a modificarse y qué valores asignar a esas columnas.
nbcolumna, es el nombre de la columna a la cual queremos asignar un nuevo valor por lo tanto debe
ser una columna de la tabla origen. El SQL estándar exige nombres sin cualificar pero algunas
implementaciones (como por ejemplo el SQL de Microsoft Jet que estamos estudiando) sí lo permiten.
La expresión en cada asignación debe generar un valor del tipo de dato apropiado para la columna
indicada. La expresión debe ser calculable a partir de los valores de la fila que se está actualizando.
Expresión no puede ser una subconsulta.

Ejemplo:

UPDATE oficinas INNER JOIN empleados


ON oficinas.oficina = empleados.oficina
SET cuota=objetivo*0.01;

En este ejemplo queremos actualizar las cuotas de nuestros empleados de tal forma que la cuota de un
empleado sea el 1% del objetivo de su oficina. La columna a actualizar es la cuota del empleado y el valor a
asignar es el 1% del objetivo de la oficina del empleado, luego la cláusula SET será SET cuota =
objetivo*0.01 o SET cuota = objetivo/100. El origen debe contener la cuota del empleado y el objetivo de
su oficina, luego el origen será el INNER JOIN de empleados con oficinas.

La cláusula WHERE indica qué filas van a ser modificadas. Si se omite la cláusula WHERE se
actualizan todas las filas.
En la condición del WHERE se puede incluir una subconsulta. En SQL standard la tabla que aparece
en la FROM de la subconsulta no puede ser la misma que la tabla que aparece como origen, pero en el SQL
de Microsoft Jet sí se puede.

Ejemplo: Queremos poner a cero las ventas de los empleados de la oficina 12

UPDATE empleados SET ventas = 0 WHERE oficina = 12;

Ejemplo: Queremos poner a cero el limite de credito de los clientes asignados a empleados de la oficina
12.

UPDATE clientes SET limitecredito = 0


WHERE repclie IN (SELECT numemp FROM empleados WHERE oficina = 12);
Si para el cálculo de expresion se utiliza una columna que también se modifica, el valor que se utiliza es el
antes de la modificación, lo mismo para la condición de búsqueda.
Cuando se ejecuta una sentencia UPDATE primero se genera el origen y se seleccionan las filas
según la cláusula WHERE. A continuación se coge una fila de la selección y se le aplica la cláusula SET,
se actualizan todas las columnas incluidas en la cláusula SET a la vez por lo que los nombres de columna
pueden especificarse en cualquier orden. Después se coge la siguiente fila de la selección y se le aplica del
mismo modo la cláusula SET, así sucesivamente con todas las filas de la selección.

Ejemplo:

UPDATE oficinas SET ventas=0, objetivo=ventas;

O bien:

UPDATE oficinas SET objetivo=ventas, ventas=0;

Los dos ejemplos anteriores son equivalentes ya que el valor de ventas que se asigna a objetivo es el
valor antes de la actualización, se deja como objetivo las ventas que ha tenido la oficina hasta el momento y
se pone a cero la columna ventas.

Si actualizamos una columna definida como clave foránea, esta columna se podrá actualizar o no
siguiendo las reglas de integridad referencial. El valor que se le asigna debe existir en la tabla de
referencia.
Si actualizamos una columna definida como columna principal de una relación entre dos tablas,
esta columna se podrá actualizar o no siguiendo las reglas de integridad referencial. Aquí puedes repasar
las reglas de integridad referencial

Borrar filas (DELETE)


La sentencia DELETE elimina filas de una tabla.
La sintaxis es la siguiente:

Origen es el nombre de la tabla de donde vamos a borrar, podemos indicar un nombre de tabla, incluir
la cláusula IN si la tabla se encuentra en una base de datos externa, también podemos escribir una
composición de tablas.
La opción tabla.* se utiliza cuando el origen está basado en varias tablas, y sirve para indicar en qué
tabla vamos a borrar.
La opción * es opcional y es la que se asume por defecto y se puede poner unicamente cuando el origen
es una sola tabla.
La cláusula WHERE sirve para especificar qué filas queremos borrar. Se eliminaran de la tabla todas las
filas que cumplan la condición. Si no se indica la cláusula WHERE, se borran TODAS las filas de la tabla.
En la condición de búsqueda de la sentencia DELETE, se puede utilizar una subconsulta. En SQL
standard la tabla que aparece en la FROM de la subconsulta no puede ser la misma que la tabla que
aparece en la FROM de la DELETE pero en el SQL de Microsoft Jet sí se puede hacer.
Una vez borrados, los registros no se pueden recuperar.
Si la tabla donde borramos está relacionada con otras tablas se podrán borrar o no los registros
siguiendo las reglas de integridad referencial definidas en las relaciones.

Ejemplo:

DELETE * FROM pedidos WHERE clie IN (SELECT numclie FROM clientes WHERE nombre = 'Julian
López');

O bien:

DELETE pedidos.* FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie WHERE
nombre = 'Julian López';
Las dos sentencias borran los pedidos del cliente Julian López. En la segunda estamos obligados a poner
pedidos.* porque el origen está basado en varias tablas.

DELETE * FROM pedidos; o DELETE FROM pedidos; Borra todas las filas de pedidos. 

Resumen del tema

Si queremos añadir en una tabla una fila con valores conocidos utilizamos la sentencia INSERT INTO
tabla VALUES (lista de valores).
Si los valores a insertar se encuentran en una o varias tablas utilizamos INSERT INTO tabla
SELECT ...
Para crear una nueva tabla con el resultado de una consulta con la sentencia SELECT...INTO tabla
FROM...
Para cambiar los datos contenidos en una tabla, tenemos que actualizar las filas de dicha tabla con
la sentencia UPDATE tabla SET asignación de nuevos valores.
Para eliminar filas de una tabla se utiliza la sentencia DELETE FROM tabla.
Con la cláusula WHERE podemos indicar a qué filas afecta la actualización o el borrado.

Como en estos ejercicios vamos a modificar los valores almacenados en la base de datos, es conveniente
guardar antes una copia de las tablas, en los cuatro primeros ejercicios crearemos una copia de los datos
almacenados para luego poder recuperar los valores originales.

Ejercicios . Actualización de datos

1 Crear una tabla (llamarla nuevaempleados) que contenga las filas de la tabla empleados.
 2 Crear una tabla (llamarla nuevaoficinas) que contenga las filas de la tabla oficinas.
 3 Crear una tabla (llamarla nuevaproductos) que contenga las filas de la tabla productos.
 4 Crear una tabla (llamarla nuevapedidos) que contenga las filas de la tabla pedidos.
 5 Subir un 5% el precio de todos los productos del fabricante ACI.
 6 Añadir una nueva oficina para la ciudad de Madrid, con el número de oficina 30, con un objetivo de
100000 y región Centro.
 7 Cambiar los empleados de la oficina 21 a la oficina 30.
 8 Eliminar los pedidos del empleado 105.
 9 Eliminar las oficinas que no tengan empleados.
 10 Recuperar los precios originales de los productos a partir de la tabla nuevosproductos.
 11 Recuperar las oficinas borradas a partir de la tabla nuevaoficinas.
 12 Recuperar los pedidos borrados en el ejercicio 8 a partir de la tabla nuevapedidos.
 13 A los empleados de la oficina 30 asignarles la oficina 21

El DDL, lenguaje de definición de datos


Introducción

Hasta ahora hemos estudiado las sentencias que forman parte del DML (Data
Management Language) lenguaje de manipulación de datos, todas esas sentencias sirven
para recuperar, insertar, borrar, modificar los datos almacenados en la base de datos; lo
que veremos en este tema son las sentencias que afectan a la estructura de los datos.

El DDL (Data Definition Language) lenguaje de definición de datos es la parte del SQL
que más varía de un sistema a otro ya que esa area tiene que ver con cómo se organizan
internamente los datos y eso, cada sistema lo hace de una manera u otra.

Así como el DML de Microsoft Jet incluye todas las sentencias DML que nos podemos
encontrar en otros SQLs (o casi todas), el DDL de Microsoft Jet en cambio contiene menos
instrucciones que otros sistemas.  
CREATE TABLE
La sentencia CREATE TABLE sirve para crear la estructura de una tabla no para
rellenarla con datos, nos permite definir las columnas que tiene y ciertas restricciones
que deben cumplir esas columnas.  

La sintaxis es la siguiente:

nbtabla: nombre de la tabla que estamos definiendo

nbcol: nombre de la columna que estamos definiendo

tipo: tipo de dato de la columna, todos los datos almacenados en la columna deberán
ser de ese tipo. Una restricción consiste en la definición de una característica adicional
que tiene una columna o una combinación de columnas, suelen ser características como
valores no nulos (campo requerido), definición de índice sin duplicados, definición de clave
principal y definición de clave foránea (clave ajena o externa, campo que sirve para
relacionar dos tablas entre sí).

restricción1: una restricción de tipo 1 es una restricción que aparece dentro de la


definición de la columna después del tipo de dato y afecta a una columna, la que se está
definiendo.

restricción2: una restricción de tipo 2 es una restricción que se define después de


definir todas las columnas de la tabla y afecta a una columna o a una combinación de
columnas.

Para escribir una sentencia CREATE TABLE se empieza por indicar el nombre de la
tabla que queremos crear y a continuación entre paréntesis indicamos separadas por
comas las definiciones de cada columna de la tabla, la definición de una columna
consta de su nombre, el tipo de dato que tiene y podemos añadir si queremos una serie
de especificaciones que deberán cumplir los datos almacenados en la columna, después
de definir cada una de las columnas que compone la tabla se pueden añadir una serie de
restricciones, esas restricciones son las mismas que se pueden indicar para cada columna
pero ahora pueden afectar a más de una columna por eso tienen una sintaxis ligeramente
diferente.

Una restricción de tipo 1 se utiliza para indicar una característica de la columna que
estamos definiendo, tiene la siguiente sintaxis:
La cláusula NOT NULL indica que la columna no podrá contener un valor nulo, es
decir que se deberá rellenar obligatoriamente y con un valor válido (equivale a la propiedad
requerido Sí de las propiedades del campo).

La cláusula CONSTRAINT sirve para definir una restricción que se podrá eliminar
cuando queramos sin tener que borrar la columna. A cada restricción se le asigna un
nombre que se utiliza para identificarla y para poder eliminarla cuando se quiera.

Como restricciones tenemos la de clave primaria (clave principal), la de índice único (sin
duplicados), la de valor no nulo, y la de clave foránea.

La cláusula PRIMARY KEY se utiliza para definir la columna como clave principal de la
tabla. Esto supone que la columna no puede contener valores nulos ni pueden haber
valores duplicados en esa columna, es decir que dos filas no pueden tener el mismo valor
en esa columna.

En una tabla no pueden haber varias claves principales, por lo que no podemos incluir
la cláusula PRIMARY KEY más de una vez, en caso contrario la sentencia da un error. No
hay que confundir la definición de varias claves principales con la definición de una clave
principal compuesta por varias columnas, esto último sí está permitido y se define con una
restricción de tipo 2.

La cláusula UNIQUE sirve para definir un índice único sobre la columna. Un índice único
es un índice que no permite valores duplicados, es decir que si una columna tiene
definida un restricción de UNIQUE no podrán haber dos filas con el mismo valor en esa
columna. Se suele emplear para que el sistema compruebe el mismo que no se añaden
valores que ya existen, por ejemplo si en una tabla de clientes queremos asegurarnos que
dos clientes no puedan tener el mismo D.N.I. y la tabla tiene como clave principal un código
de cliente, definiremos la columna dni con la restricción de UNIQUE.

La cláusula NOT NULL indica que la columna no puede contener valores nulos, cuando
queremos indicar que una columna no puede contener el valor nulo lo podemos hacer sin
poner la cláusula CONSTRAINT, o utilizando una cláusula CONSTRAINT.

La última restricción que podemos definir sobre una columna es la de clave foránea, una
clave foránea es una columna o conjunto de columnas que contiene un valor que hace
referencia a una fila de otra tabla, en una restricción de tipo 1 se puede definir con la
cláusula REFERENCES, después de la palabra reservada indicamos a qué tabla hace
referencia, opcionalmente podemos indicar entre paréntesis el nombre de la columna donde
tiene que buscar el valor de referencia, por defecto coge la clave principal de la tabla2, si el
valor que tiene que buscar se encuentra en otra columna de tabla2, entonces debemos
inidicar el nombre de esta columna entre paréntesis, además sólo podemos utilizar una
columna que esté definida con una restricción de UNIQUE, si la columna2 que indicamos
no está definida sin duplicados, la sentencia CREATE nos dará un error.
Ejemplo:

CREATE TABLE tab1 (


col1 INTEGER CONSTRAINT pk PRIMARY KEY,
col2 CHAR(25) NOT NULL,
col3 CHAR(10) CONSTRAINT uni1 UNIQUE,
col4 INTEGER,
col5 INT CONSTRAINT fk5 REFERENCES tab2 );

Con este ejemplo estamos creando la tabla tab1 compuesta por: una columna llamada
col1 de tipo entero definida como clave principal, una columna col2 que puede almacenar
hasta 25 caracteres alfanuméricos y no puede contener valores nulos, una columna col3 de
hasta 10 caracteres que no podrá contener valores repetidos, una columna col4 de tipo
entero sin ninguna restricción, y una columna col5 de tipo entero clave foránea que hace
referencia a valores de la clave principal de la tabla tab2.

Una restricción de tipo 2 se utiliza para definir una característica que afecta a una
columna o a una combinación de columnas de la tabla que estamos definiendo, se
escribe después de haber definido todas las columnas de la tabla.

Tiene la siguiente sintaxis:

La sintaxis de una restricción de tipo 2 es muy similar a la CONSTRAINT de una


restricción 1 la diferencia es que ahora tenemos que indicar sobre qué columnas queremos
definir la restricción. Se utilizan obligatoriamente las restricciones de tipo 2 cuando la
restricción afecta a un grupo de columnas o cuando queremos definir más de una
CONSTRAINT para una columna (sólo se puede definir una restricción1 en cada columna).

La cláusula PRIMARY KEY se utiliza para definir la clave principal de la tabla. Después
de las palabras PRIMARY KEY se indica entre paréntesis el nombre de la columna o las
columnas que forman la clave principal. Las columnas que forman la clave principal no
pueden contener valores nulos ni pueden haber valores duplicados de la combinación de
columnas, por ejemplo la tabla pedidos de nuestros ejemplos tiene una clave principal
formada por idfab e idproducto, pues no pueden haber dos filas con la misma combinación
de idfab con idproducto (aci,0001 por ejemplo) pero sí pueden haber dos filas con el valor
aci en la columna idfab si tienen valores diferentes en la columna idproducto, y pueden
haber dos filas con el mismo idproducto pero distinto idfab.

En una tabla no pueden haber varias claves principales, por lo que no podemos
indicar la cláusula PRIMARY KEY más de una vez, en caso contrario la sentencia da un
error.

La cláusula UNIQUE sirve para definir un índice único sobre una columna o sobre una
combinación de columnas. Un índice único es un índice que no permite valores
duplicados. Si el índice es sobre varias columnas no se puede repetir la misma
combinación de valores en dos o más filas. Se suele emplear para que el sistema
compruebe el mismo que no se añaden valores que ya existen.

La cláusula FOREIGN KEY sirve para definir una clave foránea sobre una columna o
una combinación de columnas. Una clave foránea es una columna o conjunto de columnas
que contiene un valor que hace referencia a una fila de otra tabla, en una restricción 1
se puede definir con la cláusula REFERENCES. Para definir una clave foránea en una
restricción de tipo 2 debemos empezar por las palabras FOREIGN KEY después indicamos
entre paréntesis la/s columna/s que es clave foránea, a continuación la palabra reservada
REFERENCES seguida del nombre de la tabla a la que hace referencia, opcionalmente
podemos indicar entre paréntesis el nombre de la/s columna/s donde tiene que buscar el
valor de referencia, por defecto coge la clave principal de la tabla2, si el valor que tiene que
buscar se encuentra en otra/s columna/s de tabla2, entonces debemos escribir el nombre
de esta/s columna/s entre paréntesis, además sólo podemos utilizar una columna (o
combinación de columnas) que esté definida con una restricción de UNIQUE, de lo contrario
la sentencia CREATE TABLE nos dará un error.

Ejemplo:

CREATE TABLE tab1 (col1 INTEGER,


col2 CHAR(25) NOT NULL,
col3 CHAR(10),
col4 INTEGER,
col5 INT,
CONSTRAINT pk PRIMARY KEY (col1,col2),
CONSTRAINT uni1 UNIQUE (col3),
CONSTRAINT fk5 FOREIGN KEY (col5) REFERENCES tab2 );

Con este ejemplo estamos creando la misma tabla tab1 del ejemplo de la página anterior
pero ahora hemos definido las restricciones utilizando restricciones de tipo 2.
ALTER TABLE
La sentencia ALTER TABLE sirve para modificar la estructura de una tabla que ya
existe. Mediante esta instrucción podemos añadir columnas nuevas, eliminar columnas. Ten
cuenta que cuando eliminamos una columna se pierden todos los datos almacenados en
ella.

También nos permite crear nuevas restricciones o borrar algunas existentes. La sintaxis
puede parecer algo complicada pero sabiendo el significado de las palabras reservadas la
sentencia se aclara bastante; ADD (añade), ALTER (modifica), DROP (elimina), COLUMN
(columna), CONSTRAINT (restricción).

La sintaxis es la siguiente:
La sintaxis de restriccion1 es idéntica a la restricción1 de la sentencia CREATE
TABLE, te la describimos a continuación, si tienes alguna duda repasa la sentencia
CREATE TABLE.

La sintaxis de restriccion2 es idéntica a la restricción2 de la sentencia CREATE


TABLE, te la describimos a continuación, si tienes alguna duda repasa la sentencia
CREATE TABLE.

La cláusula ADD COLUMN (la palabra COLUMN es opcional) permite añadir una
columna nueva a la tabla. Como en la creación de tabla, hay que definir la columna
indicando su nombre, tipo de datos que puede contener, y si lo queremos alguna restricción
de valor no nulo, clave primaria, clave foránea, e índice único, restriccion1 es opcional e
indica una restricción de tipo 1 que afecta a la columna que estamos definiendo.

Ejemplo:
ALTER TABLE tab1 ADD COLUMN col3 integer NOT NULL CONSTRAINT c1
UNIQUE

Con este ejemplo estamos añadiendo a la tabla tab1 una columna llamada col3 de tipo
entero, requerida (no admite nulos) y con un índice sin duplicados llamado c1.

Cuando añadimos una columna lo mínimo que se puede poner sería:

ALTER TABLE tab1 ADD col3 integer

En este caso la nueva columna admite valores nulos y duplicados.

Para añadir una nueva restricción en la tabla podemos utilizar la cláusula ADD
restriccion2 (ADD CONSTRAINT...).

Ejemplo:

ALTER TABLE tab1 ADD CONSTRAINT c1 UNIQUE (col3)

Con este ejemplo estamos añadiendo a la tabla tab1 un índice único (sin duplicados)
llamado c1 sobre la columna col3.

Para borrar una columna basta con utilizar la cláusula DROP COLUMN (COLUMN es
opcional) y el nombre de la columna que queremos borrar, se perderán todos los datos
almacenados en la columna.

Ejemplo:

ALTER TABLE tab1 DROP COLUMN col3

También podemos escribir:

ALTER TABLE tab1 DROP col3

El resultado es el mismo, la columna col3 desaparece de la tabla tab1.

Para borrar una restricción basta con utilizar la cláusula DROP CONSTRAINT y el
nombre de la restricción que queremos borrar, en este caso sólo se elimina la definición de
la restricción pero los datos almacenados no se modifican ni se pierden.

Ejemplo:

ALTER TABLE tab1 DROP CONSTRAINT c1

Con esta sentencia borramos el índice c1 creado anteriormente pero los datos de la
columna col3 no se ven afectados por el cambio.
DROP TABLE
La sentencia DROP TABLE sirve para eliminar una tabla. No se puede eliminar una
tabla si está abierta, tampoco la podemos eliminar si el borrado infringe las reglas de
integridad referencial (si interviene como tabla padre en una relación y tiene registros
relacionados).

La sintaxis es la siguiente:
Ejemplo:

DROP TABLE tab1

Elimina de la base de datos la tabla tab1.

CREATE INDEX
La sentencia CREATE INDEX sirve para crear un índice sobre una o varias columnas
de una tabla.

La sintaxis es la siguiente:

nbindi: nombre del índice que estamos definiendo. En una tabla no pueden haber
dos índices con el mismo nombre de lo contrario da error.

nbtabla: nombre de la tabla donde definimos el índice. A continuación entre


paréntesis se indica la composición del índice (las columnas que lo forman).

nbcol: nombre de la columna que indexamos. Después del nombre de la columna


podemos indicar cómo queremos que se ordenen las filas según el índice mediante las
cláusulas ASC/DESC.

ASC: la cláusula ASC es la que se asume por defecto e indica que el orden elegido
para el índice es ascendente (en orden alfabético si la columna es de tipo texto, de menor
a mayor si es de tipo numérico, en orden cronológico si es de tipo fecha).

DESC: indica orden descendente, es decir el orden inverso al ascendente.

Podemos formar un índice basado en varias columnas, en este caso después de


indicar la primera columna con su orden, se escribe una coma y la segunda columna
también con su orden, así sucesivamente hasta indicar todas las columnas que forman el
índice.

Opcionalmente se pueden indicar las cláusulas:

WITH PRIMARY indica que el índice define la clave principal de la tabla, si la tabla ya
tiene una clave principal, la sentencia CREATE INDEX dará error.

WITH DISALLOW NULL indica que no permite valores nulos en las columnas que
forman el índice.

WITH IGNORE NULL indica que las filas que tengan valores nulos en las columnas
que forman el índice se ignoran, no aparecen cuando recuperamos las filas de la tabla
utilizando ese índice.

Ejemplo:

CREATE UNIQUE INDEX ind1 ON clientes (provincia, poblacion ASC,


fecha_nacimiento DESC)

Crea un índice llamado ind1 sobre la tabla clientes formado por las columnas provincia,
población y fecha_nacimiento. Este índice permite tener ordenadas las filas de la tabla
clientes de forma que aparezcan los clientes ordenados por provincia, dentro de la misma
provincia por población y dentro de la misma población por edad y del más joven al más
mayor.

Al añadir la cláusula UNIQUE el índice no permitirá duplicados por lo que no podría tener
dos clientes con la misma fecha de nacimiento en la misma población y misma provincia,
para evitar el poblema sería mejor utilizar:

CREATE INDEX ind1 ON clientes (provincia, poblacion ASC, fecha_nacimiento


DESC)

 
DROP INDEX
La sentencia DROP INDEX sirve para eliminar un índice de una tabla. Se elimina el
índice pero no las columnas que lo forman.

La sintaxis es la siguiente:

Ejemplo:

DROP INDEX ind1 ON clientes

Elimina el índice que habíamos creado en el ejemplo anterior.

Ejercicios . El DDL Lenguaje de Definición de Datos


Si tienes ya creadas las tablas de los ejercicios del curso y no quieres perder los datos introducidos cámbiales el nombre
antes de empezar los ejercicios de esta unidad.

1 Crear la tabla empleados y definir su clave principal en la misma instrucción de creación.


2 Crear la tabla oficinas con su clave principal y su clave foránea ( la columna dir contiene el código de empleado del director
de la oficina luego es un campo que hace referencia a un empleado luego es clave foránea y hace referencia a la tabla
empleados).
3 Crear la tabla productos con su clave principal.
4 Crear la tabla clientes también con todas sus claves y sin la columna limitecredito.
5 Crear la tabla pedidos sin clave principal, con la clave foránea que hace referencia a los productos, la que hace referencia
a clientes y la que indica el representante (empleado) que ha realizado el pedido.
6 Añadir a la definición de clientes la columna limitecredito.
7 Añadir a la tabla empleados las claves foráneas que le faltan. (Si no tienes claro cuales son te lo decimos ahora: la
columna oficina indica la oficina donde trabaja el empleado y la columna director indica quién dirige al empleado, su jefe
inmediato).
8 Hacer que no puedan haber dos empleados con el mismo nombre.
9 Añadir a la tabla de pedidos la definición de clave principal.
10 Definir un índice sobre la columna region de la tabla de oficinas.
11 Eliminar el índice creado.

También podría gustarte