Você está na página 1de 40

SQL-Data Definition Language (DDL) Lenguaje de Definicin de Datos

Esquema de cada relacin.


Dominios de cada atributo. Restricciones de integridad. Restricciones de seguridad para cada relacin.

4.1

Tipos de Datos en SQL

(volveremos sobre ellos)

char(n). Cadena de longitud fija. La longitud es n caracteres. varchar(n). Cadena de longitud variable. La longitud mxima es n

caracteres. (text) int/integer. Entero. smallint. Entero corto. numeric(p,d). Numero en formato de coma fija, con precisin de p dgitos, con d dgitos a la derecha de la coma decimal. (1-> 0.9999) real, double precision. numero en coma flotante y nmero en coma flotante con doble precisin. float(n). Nmero en coma flotante con una precisin no menor de n dgitos. El valor NULL esta permitido para todos los atributos a menos que se prohba explcitamente. not null prohbe el uso del valor NULL. La construccin create domain en SQL-92 crea tipos de datos definidos por el usuario
create domain nombre-persona char(20) not null (typedef in C)

4.2

Ejemplo de Dominio
create or replace function
domain_username_constraint_check (text) returns boolean as ' select case when (length($1) >= 6) then true else false end ;

hacer

--drop function domain_username_constraint_check(text) ;

' language 'sql';


--drop domain username; create domain username as text check (domain_username_constraint_check(value)); create TABLE midominio2( nombre username); --version equivalente create TABLE midominio2( nombre text check (length(nombre) >= 6));
4.3

Da y Hora en SQL (Cont.)practica fecha creacion


date. Fecha (da del ao), ao (4 dgitos), mes y dia

Ej. date 2001-7-27


time. hora del da, en horas, minutos y segundos.

E.j. time 09:00:30


timestamp: da y hora

time 09:00:30.75

E.j. timestamp 2001-7-27 09:00:30.75


Interval: periodo de tiempo

E.j. Interval 1 day la diferencia entre date/time/timestamp da un interval Interval se puede sumar a date/time/timestamp
Se pueden extraer valores independientes de

date/time/timestamp

E.j. extract (year from r.comienzo)

4.4

Creacin de Tablas

ejemplo

Para crear una tabla se usa la orden CREATE TABLE. Es necesario especificar (al menos) el nombre de la tabla, los nombres de las columnas y el tipo de dato. Por ejemplo:

CREATE TABLE tablita ( nombre1 char(20), -- hola nombre2 integer );


Este comando crea una tabla llamada tablita con dos

-- que tal

columnas llamadas nombre1 y nombre2.

4.5

Destruccin de Tablas

Cuando las tablas no sean necesarias se pueden borrar con la orden DROP TABLE. Por ejemplo:

DROP TABLE tablita;


Todos los comandos CREATE tienen una pareja DROP

4.6

Columnas Auxiliares Creadas por PostgeSQL


ejemplo, pgacces

Cada tabla tienen varias columnas definidas por la

base de datos. Los nombres de estas columnas auxiliares no se pueden usar como nombres de las columnas definidas por el usuario. oid tableoid xmin cmin xmax cmax ctid

4.7

Valores por Defecto

ejemplo

Se le puede asignar un valor por defecto a una columna.

Cuando se crea la tupla si no se le asigna ningn valor a a alguna de las columnas est coger su valor por defecto. (si no se declara explcitamente el valor por defecto es NULL)
A la hora de definir la tabla los valores por defecto van tras la

declaracin de la columna. Esto es: CREATE TABLE productos ( producto_no integer PRIMARY KEY, nombre text, --soy un comentario precio numeric(10,2) DEFAULT 9.99

);

4.8

Valores por Defecto


CREATE SEQUENCE producto_no_seq; CREATE TABLE productos (

ejemplo

producto_no integer PRIMARY KEY DEFAULT nextval('producto_no_seq'), nombre text, precio numeric(10,2) DEFAULT 9.99 );

CREATE UNIQUE INDEX producto_no ON productos ( producto_no );

4.9

Restricciones

Check, Restriccion arbitraria Not-Null, El atributo no acepta valores nulos Unique, El atributo no acepta valores repetidos

Primary Keys, El atributo es clave primaria


Foreign Keys, El atributo es clave extranjera

4.10

CHECK

ejemplo

Permite especificar que los valores de una columna deben

satisfacer una expresin. Por ejemplo ser positivo. CREATE TABLE productos ( producto_no integer, nombre text, precio numeric(10.2) CHECK (precio > 0) );
La restriccin debe definirse DESPUES del tipo de dato. Se

define usando la palabra CHECK seguida de una expresin entre parntesis

4.11

CHECK

ejemplo

Permite especificar que los valores de una columna deben

satisfacer una expresin. Por ejemplo ser positivo. CREATE TABLE productos ( producto_no integer, nombre text, precio numeric(10,2) CONSTRAINT precio_positivo CHECK (precio > 0) );
CONSTRAINT nombre_ligadura puede usarse con las otras

restricciones

4.12

CHECK

Las restricciones pueden involucrar varias columnas pero no varias tablas. CREATE TABLE productos ( producto_no integer, nombre text, precio numeric CHECK (price > 0), precio_rebajado numeric CHECK

(precio_rebajado > 0),


CHECK (precio > precio_rebajado ) );

4.13

CHECK, Advertencia

CHECK se satisface si la expresion evaluada es TRUE o NULL.

4.14

NOT NULL

ejemplo

Indica que el atributo no puede valer NULL

CREATE TABLE productos (

producto_no
precio );

integer NOT NULL,

nombre text NOT NULL, numeric(10,2)

4.15

NOT NULL
Pueden existir varias restricciones referidas al mismo atributo, el

order no importa. CREATE TABLE productos ( producto_no integer NOT NULL, nombre text NOT NULL, precio numeric(10,2) NOT NULL CHECK (precio

> 0)
);

4.16

UNIQUE

ejemplo

Asegura que un determinado valor no esta repetido en una columna. CREATE TABLE productos ( producto_no integer UNIQUE, nombre text, precio numeric(10,2)

);

4.17

UNIQUE

ejemplo

Alternativamente se puede usar la sintaxis

CREATE TABLE productos (

producto_no integer,
nombre text, precio numeric, UNIQUE(producto_no,nombre) );
Pregunta: producto_no y nombre deben ser nicos o la

pareja debe ser nica?

4.18

UNIQUE

ejemplo

Esta tabla es equivalente a la anterior?

CREATE TABLE productos (

producto_no integer UNIQUE,


nombre text UNIQUE, precio numeric(10.2) ); CREATE TABLE productos ( producto_no integer, nombre text,

precio numeric(10.2),
UNIQUE(producto_no,nombre) );
4.19

UNIQUE vs CHECK
CREATE TABLE example ( a integer, b integer, c integer, UNIQUE (a, c) ); ); CREATE TABLE example ( a integer, b integer, c integer, CHECK (a > 0 AND b > 0)

4.20

Clave Primaria
CREATE TABLE productos (

ejemplo

producto_no integer PRIMARY KEY, nombre text, precio numeric ); CREATE TABLE ejemplo (

a integer,
b integer, c integer, PRIMARY KEY (a, c)

);

4.21

Clave Primaria: Es esto equivalente?


CREATE TABLE productos ( a integer PRIMARY KEY, b text PRIMARY KEY, c numeric ); CREATE TABLE ejemplo (

ejemplo

a integer,
b integer, c integer, PRIMARY KEY (a, c)

);

4.22

Pregunta:

Es equivalente UNIQUE a PRIMARY KEY?

4.23

Clave Extranjera

ejemplo,trigger

La restriccion REFERENCES asegura que los valores de una determinada columna debe ser identicos a los valores que aparecen en otra determinada columna que puede estar en otra tabla
CREATE TABLE productos ( producto_no integer PRIMARY KEY, nombre text, precio numeric); CREATE TABLE pedidos ( pedido_no integer PRIMARY KEY, producto_no integer REFERENCES productos (producto_no), cantida integer);

PostgeSQL no nos dejara crear pedidos sobre productos que no

existan
4.24

Triggers (una interrupcin)

ejemplo

Un trigger es un pedazo de codigo SQL que se ejecuta

automaticamente cuando se invoca una cierta accin


SQL 99 (subset) Por ejemplo: Para guardar la fecha de actualizacin:

4.25

Triggers

template1,plpgsql-sql

CREATE TABLE tomate( tomate_no int PRIMARY KEY, color char(10), modificadoen timestamp);

DROP FUNCTION modificacion(); CREATE FUNCTION modificacion() RETURNS TRIGGER AS ' BEGIN NEW.modificadoen := ''now''; RETURN NEW; END;'LANGUAGE 'plpgsql' WITH (isstrict);
DROP TRIGGER t_modificacion on tomate; CREATE TRIGGER t_modificacion BEFORE INSERT ON tomate FOR EACH ROW EXECUTE PROCEDURE modificacion();
4.26

Clave Extranjera
Qu pasa si se borra el producto_no en la tabla

productos? CREATE TABLE productos ( producto_no integer PRIMARY KEY, nombre text, precio numeric); CREATE TABLE pedidos ( pedido_no integer PRIMARY KEY, producto_no integer REFERENCES productos (producto_no),

cantida integer);
Qu pasa si se borra/cambia el producto_no en la tabla

productos?
4.27

Poblar las tablas anteriores


INSERT into INSERT into INSERT into productos VALUES (1,'aaa',12.1); productos VALUES (2,'bbb',12.1); pedidos VALUES (1,1,5);

INSERT into

pedidos VALUES (2,3,7);

4.28

Clave Extranjera
CREATE TABLE productos ( producto_no integer PRIMARY KEY, nombre text, precio numeric);

ejemplo

CREATE TABLE pedidos ( pedido_no integer PRIMARY KEY, producto_no integer REFERENCES productos (producto_no), cantida integer); CREATE TABLE producto_pedido ( producto_no integer REFERENCES productos ON DELETE RESTRICT, pedido_no integer REFERENCES pedidos ON DELETE CASCADE, cantidad integer, PRIMARY KEY (producto_no, pedido_no) ); According to the SQL standard, specifying either RESTRICT or CASCADE is required. No database system actually implements it that way, but whether the 4.29 default behavior is RESTRICT or CASCADE varies across systems.

Clave primaria y Clave Extranjera


La clave primaria y extranjera pueden usar los mismos atributos

CREATE TABLE producto_pedido ( producto_no integer REFERENCES productos, pedido_id integer REFERENCES orders, cantidad integer, PRIMARY KEY (producto_no, pedido_id)

);
Importante, una clave extranjera no puede ser clave extranjera

de otra relacin. CREATE TABLE inventario (

product_no integer REFERENCES pedidos


producto_no,

4.30

Modificar tablas:Drop y Alter

ejemplo

La orden drop table nombre_de_la_tabla elimina la tabla

nombre_de_la_tabla (y toda informacin relacionada con ella) de la base de datos.


La orden alter table nombre_de_la_tabla se usa para

aadir atributos a una relacin. alter table productos add column A integer El valor inicial de los atributos es NULL (a menos que se especifique un valor por defecto).
La orden alter table se puede usar para borrar atributos de

una tabla alter table productos drop A

4.31

Aadir/Modificar una restriccin ejemplo


ALTER TABLE productos ADD CHECK (name <> ''); ALTER TABLE productos ADD CONSTRAINT some_name

UNIQUE (producto_no);
ALTER TABLE productos ADD FOREIGN KEY

(producto_group_id) REFERENCES product_groups;

ALTER TABLE productos ALTER COLUMN product_no

SET NOT NULL;


ALTER TABLE products ALTER COLUMN price SET

DEFAULT 7.77;
ALTER TABLE products RENAME COLUMN product_no TO

product_number;

4.32

Herencia ejemplo
Una tabla puede estar basada en otra (ISA)

CREATE TABLE ciudades ( nombre poblacion altura ); char(30), float, int -en metros

CREATE TABLE capitales (


pais char(30) ) INHERITS (ciudades);
Cada tupla de capitales contiene TODOS los atributos de ciudades.
Qu pasa con capitales si altero ciudades?

4.33

Etc
Las tablas son los objeto centrales en una base de datos pero

no son los nicos objetos que existen en una base de datos:


Vistas Funciones Triggers etc

4.34

Ejemplo Banco

Ejemplo Banco I
sucursal (nombre-sucursal, ciudad-sucursal, capital) cliente (nombre-cliente, calle-cliente, ciudad-cliente)

cuenta (numero-cuenta, nombre-sucursal, saldo)


prestamo (numero-prestamo, nombre-sucursal, cantidad) cliente-cuenta (nombre-cliente^, nmero-cuenta^) cliente-prestamo (nombre-cliente^, numero-prestamo^)

4.36

Ejemplo Banco II
CREATE TABLE sucursal( nombre-sucursal char(30), ciudad-sucursal char(30), capital char(30), PRIMARY KEY (nombre-sucursal) ) CREATE TABLE cliente( nombre-cliente char(30), calle-cliente char(30), ciudad-cliente char(30), PRIMARY KEY (nombre-cliente ) )

error/ejemplo

CREATE TABLE cuenta( numero-cuenta numeric(25), nombre-sucursal char(30), saldo numeric(15,2) NOT NULL, PRIMARY KEY (numero-cuenta ) ) CREATE TABLE prestamo ( numero-prestamo numeric(25), nombre-sucursal char(30), cantidad numeric (15,2) NOT NULL, PRIMARY KEY (numero-cuenta ) )

Debemos poner NOT NULL

a todo?

Hay al menos tres errores en

estas ordenes:
; - vs. _ numero_cuenta
4.37

Ejemplo Banco III


CREATE TABLE cliente_cuenta ( nombre_cliente numero_cuenta ); CREATE TABLE cliente_prestamo ( nombre_cliente numero_prestamo char(30) REFERENCES cliente, numeric(25) REFERENCES prestamo, char(30) REFERENCES cliente, numeric(25) REFERENCES cuenta,

PRIMARY KEY (nombre_cliente, nmero_cuenta)

PRIMARY KEY (nombre_cliente, nmero_prestamo)

);

4.38

ltima pregunta
CREATE TABLE i1 (i int, I int); CREATE TABLE i2 ('i' int, 'I' int); CREATE TABLE i3("i" int, "I" int);

comentar pgaccess

4.39

FIN

Você também pode gostar