Sei sulla pagina 1di 118

Tablas, TDU, vistas,

indices, reglas,
defaults

SQL (Structured Query Language)


SQL lenguaje usado para definir, manipular, y controlar
bases de datos relacionales
Definido por ANSI (American National Standards Institute)

Comandos SQL se pueden dividir en tres categoras:


DDL (Data definition language)
create, alter, drop

DML (Data manipulation language)

select, insert, update, delete

DCL (Data control language)

grant, revoke

Creacin de Tablas

Diseo de Tablas

Una Tabla es un objeto de base de datos que almacena


datos en filas y columnas
Antes de crear una tabla, se debe disear su estructura:
1. Darle nombre a la tabla y a cada columna
2. Seleccionar un tipo de dato para cada columna
3. Escoger las propiedades de cada columna

Datatype
Un tipo de datos (datatype) es un atributo asignado a una
columna que especifica el tipo de informacin que puede
almacenarse en esa columna

Seleccionar Datatypes
Para seleccionar el datatype de una columna:
1. Determinar el conjunto posible de valores
2. Determinar la precisin requerida
3. Encontrar el datatype que:

Pueda guardar todos los posibles valores


Proporcione la exactitud y precisin requeridas
Use eficientemente el almacenamiento
Facilite el futuro crecimiento

Categoras de Datatypes
Nmeros exactos
Nmeros con exactitud y precisin predecibles

Nmeros aproximados
Nmeros con valores dependiendo de exactitud y precisin del
almacenamiento

Money
Valores para pesos

Date y time
Valores de fechas y horas

Character
Para strings caracteres

Binary
Informacin binaria (como imgenes, video y bits)

Ejemplos de Datatypes por Categoras


Nmeros exactos
integer, numeric (p,s), decimal (p,s)

Nmeros aproximados
float (p), real, double precision (dependientes de mquina)

Money
money

Date y time
datetime

Character
char (n), varchar (n), text

Binary
bit, binary, varbinary, image

Datatypes definidos por el Usuario


Un datatype definido por el usuario es un datatype creado
por el usuario de un datatype del sistema
Muy til para asegurar consistencia de mltiples columnas
que almacenan el mismo conjunto de valores

Propiedades de las Columnas


Una columna puede tener una de las siguientes
propiedades:
NULL
NOT NULL
IDENTITY
Si no se especifica, generalmente se asume NOT NULL

Valores tipo NULL


Un NULL representa un valor desconocido o que no aplica
Para valores numricos, NULL no es igual a 0
Para caracteres, NULL no es igual a '' '' (caracter en
blanco)

NULL no se considera considera menor que, mayor que, o


igual a cualquier otro valor
Dos NULL no se consideran iguales

Propiedades de NULL
Una columna con la propiedad NULL permite NULLs
Esto se conoce como nullable column

Una columna con la propiedad NOT NULL no permite


NULLs
Una columna que no se le especifique esta propiedad
asume que permite NULLs

Propiedad IDENTITY
La propiedad IDENTITY hace que el sistema asigne
automticamente valores nicos a cada fila

Cuando se insertan datos en una tabla, el servidor


automticamente asigna un nmero secuencial a la columna
que tiene la propiedad de IDENTITY

Reglas para columnas con IDENTITY

Slo puede existir una por tabla


Debe de ser de tipo numrico sin posiciones decimales
No se puede actualizar
No acepta valores tipo NULL
Inicia por default en 1
Se puede asignar un valor de arranque

Crear Tablas

Sintaxis Simplificada para create :


CREATE TABLE table_name (
column_name datatype
...
column_name datatype

[ NULL | NOT NULL | IDENTITY ] ,


[ NULL | NOT NULL | IDENTITY ] )

Crear Tabla
create table empleado (
emp_id

numeric(4,0) IDENTITY,

apellido

varchar(30) NOT NULL,

nombre

varchar(30) NOT NULL,

e_mail

char(6)

departamento

typ_ch_deptid

NULL,
)

Borrar Tablas
Sintaxis Simplificada para drop:

DROP TABLE table_name


Ejemplo:

drop table empleado

Clusula default

La clusula default hace que el servidor d un valor cuando el


valor no se proporciona explcitamente al hacer un insert
Sintaxis Simplificada :
create table table_name (
column_name datatype
...)

default default_value [property],

Modificacin de clusulas default


Sintaxis Simplificada:

alter table table_name


replace column_name default default_value
A pesar de que la sintaxis usa la palabra replace, el
comando alter table se puede usar para aadir clusulas
default a una tabla

Ejemplo de modificacin de clusulas default

alter table publica


replace ciudad default Cali"
alter table publica
replace depto default Valle

Tablas y Permisos
Para permitir que otros usuarios puedan consultar,
manipular los datos o hacer referencia a una tabla, se deben
dar permisos
Sintaxis Simplificada:
grant { select | insert | update | delete | reference | all }
on table_name
to user_list
Ejemplo:
grant select on empleado to juan, sandra, pablo

Adicin de Columnas
Despus de creada una tabla, se pueden aadir columnas
Algunos DBMS no permiten borrar directamente una
columna de una tabla
Para borrar una columna, se debe borrar y volver a crear la tabla

Sintaxis para aadir una columna a una tabla:


alter table table_name
add column_name datatype NULL
[, column_name datatype NULL ...]
Todas las columnas aadidas deben tener la propiedad
NULL.

Adicionar Columnas
alter table editor
add address varchar(40) NULL,
country varchar(20) NULL

Copiar Tablas
select into es una extensin que se usa para crear una
copia de una tabla existente

Sintaxis de select into


Sintaxis Simplificada :

select column_list into new_table_name


from old_table_name
[where condition]

Ejemplos de select into


Ejemplo de copiado de todas las columnas:

select * into titles_copy


from titles
Ejemplo de copiado de algunas columnas :
select title_id, title, type
into titles_copy
from titles

Ejemplos de select into


Ejemplo que copia algunos datos:
select * into titles_copy
from titles
where price > $12.00
Ejemplo que no copia datos:
Porque la clusula where siempre da falso, se copia la
estructura de la tabla pero no sus datos

select * into titles_copy


from titles
where 1 = 2

Data Manipulation Language


DML es uno de los tres grupos principales de
sentencias SQL
Comprende cuatro sentencias:

insert aade datos a una tabla


update actualiza datos existentes en una tabla
delete borra datos de una tabla
select consulta datos de una tabla

Sintaxis para insert


sintaxis Simplificada:

insert [into] table_name [(column_list)]


{ values (value_list) | select_statement }

Ejemplos:
insert into editor
values ("736", Nuevas BD", Pasto",
Nario")
insert into editor (nombre, pub_id)
values (Prensa Actual", "2003)

Extensin SQL para insert


Se pueden insertar mltiples filas en un solo insert
utilizando un select embebido
Ejemplo:
insert into editor
select * from pub..editor
Las columnas en las que se van a insertar datos deben
tener los mismos tipos de datos que resulten de las
columnas del query

Sintaxis para update


Sintaxis Simplificada :

update table_name
set column1 = { expression | select_statement }
[, column2 = { expression | select_statement } ...]
[from table_list]
[where condition]

Ejemplos:
update titles

set price = price * $1.25

update authors
set address = "1224 Mason Ct.",
phone = "415 773-2882"
where au_id = "427-17-2319"

Extensin para update


Se pueden encadenar condiciones en la clusula
where de un update
Ejemplo:
update titulo
set precio = precio * $0.90
from titulo t, editor p
where t.pub_id = p.pub_id
and p.state = Nario"

Sintaxis para delete


Sintaxis Simplificada:

delete [from] table_name


[where condition]

Ejemplos:
delete from editor
delete from titulo
where tipo = "business"
delete from autor
where au_fname = "Luis"
and au_lname = Caicedo"

Extensin para delete


Se pueden encadenar condiciones en la clusula
where de un delete
Sintaxis simplificada :
delete table_name
from table_list
[where join_condition]

Ejemplo
delete titles
from titles t, publishers p
where t.pub_id = p.pub_id
and p.state = "CA"

truncate table
truncate table borra todas las filas de una tabla
La operacin se ejecuta ms rpido que la
correspondiente sentencia delete
El comamdo no se puede usar para borrar algunas filas
de la tabla

Sintaxis simplificada:
truncate table table_name

Ejemplo:
truncate table publishers

Registro de Transacciones (Log)


El registro de transacciones se utiliza para recuperar los datos
en el evento de un error del usuario o falla del sistema
Acta ante cada insert, update, y delete

Algunas operaciones no se registran


Ejemplo de operaciones sin registro:
select into
truncate table

Select

La sentencia select consulta datos


Sintaxis simplificada:
select column_list
from table_name
[where condition]
[group by column_list]
[having condition]
[order by column_list]

Ejemplo:
select type, avg(price)
from titles
where type not in ("mod_cook", "trad_cook")
group by type
having avg(price) > $12.00
order by type

Vista
Una vista es un objeto de base de datos que consiste de una
sentencia select almacenada
Usada para:
Simplificar la construccin de consultas complejas
Simplificar al usuario la percepin de la base de datos
Limitar el acceso a los datos

Crear y borrar vistas


Sintaxis Simplificada para crear una vista :
create view view_name [(column1 [, column2...])
as
select_statement
[with check option]

Ejemplo:

create view vw_california_authors


as
select au_id, au_lname, au_fname, state, phone
from authors
where state = "CA"

Sintaxis simplificada para borrar una vista:


drop view view_name

Ejemplo:

drop view vw_california_authors

Vistas y permisos
Para permitir que otros utilicen una vista, se deben dar
permisos:
grant [ select | insert | update | delete | all ]
on view_name
to user_list

Ejemplo:
grant select
on vw_california_authors
to clerk1, clerk2, clerk3, clerk4

Consultar datos usando vistas


Para consultar datos usando vistas, usar el nombre de la vista
como si se tratara de una tabla
Ejemplo:
select * from vw_california_authors
au_id
au_lname
-----------172-32-1176 White
213-46-8915 Green
238-95-7766 Carson
267-41-2394 O'Leary
274-80-9391 Straight
...
(15 rows affected)

au_fname
-------Johnson
Marjorie
Cheryl
Michael
Dick

state
----CA
CA
CA
CA
CA

phone
----408 496-7223
415 986-7020
415 548-7723
408 286-2428
415 834-2919

Modificar datos usando vistas


Se pueden modificar datos usando vistas si:

Todas las columnas involucradas estn en una tabla


Todas las columnas no usadas en la vista ni permiten NULLs,
contienen la clusula default o contienen columnas con IDENTITY
Ejemplo:

insert into vw_california_authors


values ("123-54-8808", "Chen", "Rose", "CA",
"415 239-6467")

Se pueden actualizar datos usando vistas si:

Todas las columnas involucradas estn en una tabla

Se pueden borrar datos usando vistas si:


La vista est basada en una sola tabla
Ejemplo:

delete from vw_california_authors


where au_lname = "Hunter"

Usar vistas para simplificar el acceso


Las vistas pueden simplificar el acceso a los datos
almacenando las consultas complejas (tales como
joins)
Ejemplo:
create view vw_pub_title_join (publisher, title)
as
select pub_name, title
from publishers, titles
where publishers.pub_id = titles.pub_id
go
select * from vw_pub_title_join
pub_name
-------New Age Books
New Age Books
...

title
----You Can Combat Computer Stress
Is Anger the Enemy?

Usar vistas para restringir acceso


Una vista puede permitir a los usuarios acceder a una parte de la tabla
cuando el acceso al contenido total de la tabla est restringido

create view vw_california_authors


as
select au_id, au_lname, au_fname, state, phone
from authors
where state = "CA"
go
grant all on vw_california_authors to public
revoke all on authors from public

Opcin with check


with check option restringe cmo se pueden modificar las
filas. Una operacin falla si:
Tratar de insertar filas que las vista no puede ver
Tratar de modificar filas que las vista no puede ver

Ejemplo:
create view vw_kansas_authors
as
select au_id, au_lname, au_fname, state, phone
from authors
where state = "KS"
with check option

Ejemplo de modificacin que da error:


update vw_kansas_authors
set state = "MO" where state = "KS"

Reglas para vistas


La definicin de una vista puede incluir:

Una clusula where


Una columna con valores calculados (ej. precio * cant)
Funciones Agregadas, una clusula group by, y una clusula
having
distinct
Un join
Otra vista (hasta 16 niveles)

Una definicin de una vista no puede incluir:


Una clusula order by
Una clusula compute o compute by
select into

Ejemplos con vistas


Crear dos tablas:
select * into mytitles
from pubs2..titles
select * into mypublishers
from pubs2..publishers

Crear vista que muestra titles y sus publishers va un join:


create view vw_titles_pubs (title, publisher)
as
select title, pub_name
from mytitles, mypublishers
where mytitles.pub_id = mypublishers.pub_id

Usar la vista para mostrar los titles y sus publishers:


select * from vw_titles_pubs

Ejecute las siguientes sentencias, cules pueden o no fallar.


Si la Sentencia falla, explique por qu:
select price from vw_titles_pubs

_______________________________
update vw_titles_pubs
set publisher = "New Millenium Books"
where publisher = "New Age Books"

_______________________________
insert into vw_titles_pubs
values ("Life in Houston", "TexTitles")

________________________________

Borrar los objetos creados:

drop view vw_titles_pubs


drop table mytitles, mypublishers

Table scan
Un table scan es una bsquda en donde se leen todas las
filas de una tabla
Una tabla que no tenga ndices creados, solamente puede
hacer bsquedas a travs de un table scan

Indices
Un ndice es un objeto de base de datos que ayuda al
servidor a encontrar un dato ms rpidamente

Estructura de un Indice : Caso de Estudio


authors table
(data pages)

Index pages
key
key
Bennet
Karsen
Smith

row
ptr

pg
ptr

PAGE
PAGE1001
1001
1421, 1
1007
1876, 1
1305
1242, 1
1062

row
ptr

pg
ptr

Bennet
Greane
Hunter

PAGE
PAGE1007
1007
1421, 1
1132
1242, 4
1133
1242, 1
1127

Karsen

PAGE
PAGE1305
1305
1876, 1
1311

(more pages)
create index idx_authors_2
on authors(au_lname)

PAGE
PAGE1132
1132
Bennet
1421, 1
Chan
1129, 3
Dull
1409, 1
Edwards
1018, 5
PAGE
PAGE1133
1133
Greane
1242, 4
Green
1421, 2
Greene
1409, 2
PAGE
PAGE1127
1127
Hunter
1242, 1
Jenkins
1241, 4

(more pages)

PAGE
PAGE1241
1241
10
OLeary
11
Ringer
White
12
13
Jenkins
PAGE
PAGE1242
1242
14
Hunter
15
Smith
Ringer
16
17
Greane
PAGE
PAGE1421
1421
18
Bennet
19
Green
Ringer
20
PAGE
PAGE1409
1409
21
Dull
22
Greene
White
23

(more pages)

Crear y borrar ndices


Sintaxis simplificada para create :

create [unique] [ clustered | nonclustered ]


index index_name
on table_name (column1 [, column2] ... )

Ejemplo:
create clustered index idx_c_titles_1
on titles (title_id)

Sintaxis Simplicada para drop :

drop index table_name.index_name

Ejemplo:
drop index titles.idx_c_titles_1

Atributos de los ndices


Tres atributos describen cada ndice
El nmero de columnas sobre las cuales se declara el ndice
Una columna ndice no-compuesto
Mltiples columnas - ndice compuesto

Si el ndice acepta o no valores duplicados


Se permiten valores duplicados - ndice no-nico
No se permiten valores duplicados - ndice nico

Si estn o no ordenados los datos en la tabla por el concepto del


ndice cuando la tabla se crea
Datos ordenados durante la creacin - ndice cluster
Datos no ordenados durante la creacin - ndice no-cluster

Indice no-compuesto
Un ndice no-compuesto es un ndice creado sobre una
columna
Ejemplo:
create index idx_authors_2
on authors(state)

Apropiado cuando las consultas se hacen frecuentemente


sobre una sola columna
Ejemplo:
select * from authors
where state = "UT"

Indice compuesto
Un ndice compuesto es un ndice creado sobre dos o
ms columnas
Ejemplo:
create index idx_authors_3
on authors(au_lname, au_fname)

Apropiado cuando las consultas se hacen sobre


mltiples columnas
Ejemplo:
select * from authors
where au_lname = "Ringer" and au_fname = "Anne"

Indice no-nico
Un Indice No-nico es un ndice que permite valores
duplicados
Ejemplo:
create index idx_authors_2
on authors(state)

Apropriado cuando las consultas se hacen sobre


valores duplicados
Ejemplo:
select * from authors
where state = "UT"

Indice nico
Un ndice nico es un ndice que no permite valores
duplicados
Ejemplo:

create unique index idx_u_authors_1


on authors(au_id)

Apropiado cuando cada valor en la columna indizada debe


ser nico
Ejemplo:

select * from authors


where au_id = "213-46-8915"

Puede ser creado solamente sobre columnas que no tengan


valores duplicados

Indice no-cluster
Un ndice no-cluster es un ndice que utiliza un concepto de
ordenamiento diferente a como se realiz el almacenamiento
de la tabla
Ejemplo:
create nonclustered index idx_authors_4
on authors(state)

Una tabla puede tener muchos ndices no-cluster


Apropiado para:
Tablas que ya tienen un ndice cluster

Estructura de un ndice no-cluster


Index pages
root level

intermediate level
key

key
Bennet
Karsen
Smith

row
ptr

pg
ptr

PAGE
PAGE1001
1001
1421, 1
1007
1876, 1
1305
1242, 1
1062

row
ptr

pg
ptr

Bennet
Greane
Hunter

PAGE
PAGE1007
1007
1421, 1
1132
1242, 4
1133
1242, 1
1127

Karsen

PAGE
PAGE1305
1305
1876, 1
1311

(more pages)
create index idx_authors_2
on authors(au_lname)

leaf level

key

row ptr

PAGE
PAGE1132
1132
Bennet
1421, 1
Chan
1129, 3
Dull
1409, 1
Edwards
1018, 5
PAGE
PAGE1133
1133
Greane
1242, 4
Green
1421, 2
Greene
1409, 2
PAGE
PAGE1127
1127
Hunter
1242, 1
Jenkins
1241, 4

(more pages)

authors table
(data pages)
PAGE
PAGE1241
1241
10
OLeary
11
Ringer
White
12
13
Jenkins
PAGE
PAGE1242
1242
14
Hunter
15
Smith
Ringer
16
17
Greane
PAGE
PAGE1421
1421
18
Bennet
19
Green
Ringer
20
PAGE
PAGE1409
1409
21
Dull
22
Greene
White
23

(more pages)

Indice cluster
Un ndice cluster es un ndice que, cuando se crea, indica cmo
estn fsicamente almacenados los datos en la tabla
Ejemplo:

create clustered index idx_c_authors_1


on authors(au_id)

Una tabla slo puede contener un ndice cluster


Tpicamente mejora el rendimientos de las consultas que se hacen a
una tabla
Consultas con valor nico (where state = ''CA'')
Consultas por rango de valores (where price > $10.00)

Puede dismuir el rendimiento en operaciones de modificacin de los


datos de una tabla
Esta reduccin se debe a que se deben almacenar fsicamente los
datos ordenados

Etructura de un ndice cluster


Index pages
root level

intermediate level
key

key
Bennet
Karsen
Smith

pg ptr
PAGE
PAGE1001
1001

Bennet
Greane
Hunter

1007
1305
1062
Karsen

pg ptr
PAGE
PAGE1007
1007

PAGE
PAGE1305
1305

1241
1242
1421

1409

(more pages)
create clustered index idx_authors_2
on authors(au_lname)

authors table
(leaf/data pages)
PAGE
PAGE1241
1241
10
Bennet
11
Chan
Dull
12
13
Edwards
PAGE
PAGE1242
1242
14
Greane
15
Green
Greene
16
17
PAGE
PAGE1421
1421
18
Hunter
19
Jenkins
20
PAGE
PAGE1409
1409
21
Karsen
22
O'Leary
Ringer
23

(more pages)

Escritura de consultas que usen ndices


Los ndice se usan solamente cuando una consulta hace
referencia a columna(s) indizada(s) en la clusula where
Si una tabla:

Tiene dos columnas, y


Cualquiera puede identificar una fila desada, y
Una columna est indizada mientras la otra no, entonces
Se debe utilizar la columna indizada en la clusula where de
la consulta

Tabla temporal

Una tabla temporal es a tabla que eventualmente la borra el


servidor sin que se ejecute la sentencia drop table
Tpicamente existen dos tipos de tablas temporales:
Compartidas (Shareable)
De sesin especfica

Uso de tablas temporales


Uso de tablas temporales:
Por el usuario:
Para guardar resultados de consultas muy complejas
Para almacenar resultados intermedios (por ejemplo de stored
procedure)

Por el sistema:
Para almacenar resultados intermedios de consultas que
requieren ordenamiento o eliminacin de valores
Para almacenar resultados intermedios de consultas que tienen
la clusula compute o agregadas

Tablas del sistema

Una tabla del sistema es una tabla creada y


mantenida por el servidor que almacena
informacin acerca del servidor o de sus bases
de datos

Integridad de datos
Tres tipos de integridad ayudan a garantizar que los datos son
correctos
integridad a nivel de dominio
Asegura que cualquier valor en una columna est dentro del
conjunto de valores vlidos para esa columna

integridad a nivel de entidad

Asegura que cualquier fila de una tabla puede identificarse


inequvocamente

integridad referencial

Asegura que un determinado valor no puede escribirse en una


tabla si ese valor no existe en otra tabla

Dos mtodos para forzar integridad


Domain
Integrity

Entity Integrity

Referential
Integrity

Constraints

Check
constraints

Primary key
constraints,
unique
constraints

References
constraints

Database
Objects

Rules

Indexes

Triggers

Constraint
Un constraint es un elemento de la sentencia create table
que forza uno de los tres tipos de integridad de datos
Declarada a nivel de columna o de tabla

Los constraints tambin se conocen como declarative


integrity

Integridad a nivel de dominio


La integridad a nivel de Dominio asegura que cualquier valor
en una columna est dentro del conjunto de valores
aceptables para esa columna

Restriccin Check
Un check constraint forza integridad a nivel de Dominio
durante las adiciones y actualizaciones
Si una sentencia contiene un valor que no concuerda con los
permitidos, la sentencia falla

Restriccin check a nivel de columna


Sintaxis Simplificada:
create table table_name (
column_name datatype
[ NULL | NOT NULL | IDENTITY ]
[constraint constraint_name]
check (condition_using_column_name) ,
...
column_name datatype
[ NULL | NOT NULL | IDENTITY ]
)

Ejemplo:
create table publishers (
pub_id
char(4)
NOT NULL
constraint chk_pub_id
check (pub_id like "99[0-9][0-9]"),
pub_name
varchar(40) NULL,
city varchar(20) NULL,
state
char(2)
NULL
)

Nombre de restriccin a nivel de columna


Si un usuario no da el nombre de una restriccin a nivel de
columna, el servidor genera uno
Para simplificar la administracin, el usuario debera escribir el
nombre de todos los constraints
El nombre de un Constraint debe ser nico a nivel de la base de
datos

Restriccin a nivel de tabla


Sintaxis Simplificada:

create table table_name (


column_name datatyp
[ NULL | NOT NULL | IDENTITY ] ,
...
column_name datatype
[ NULL | NOT NULL | IDENTITY ],
[constraint constraint_name]
check (condition_involving_any_column_or_columns)
)

Ejemplo:
create table discounts (
discounttype varchar(40)
NOT NULL,
stor_id
char(4)
lowqty
smallint
NULL,
highqty
smallint
NULL,
discount
float
NOT NULL,
constraint chk_low_high
check (lowqty <= highqty)
)

NULL,

Restricciones y defaults
Los servidores permiten que una tabla tenga default y check
sin que haya contradiccin
Ejemplo (cualquier insert que use el default fallar):
create table publishers (
pub_id
char(4)
NOT NULL,
pub_name varchar(40) NULL,
city varchar(20) default "Tulsa"
NULL,
state
char(2)
default "OK"
NULL,
constraint chk_state
check (state in ("CA", "OR", "WA", "NV"))
)
insert into publishers (pub_id, pub_name)
values ("9909", "Failed Imprints")

Integridad a nivel de entidad


La integridad a nivel de entidad asegura que cada fila de una
tabla est identificada de manera inequvoca

Primary key
Combinacin de una o ms columnas que identifican de
manera inequvoca una fila en una tabla

Restriccin primary key


Una restriccin primary key asegura integridad a nivel de
entidad
Crea un ndice nico sobre la columna(s) especificada(s)
Se asegura integridad en los inserts y updates
Slo puede existir una llave primaria por tabla

Indices creados por primary key

Unico
Cluster
No permite valores NULL en la(s) columna(s)
No se puede borrar usando la sentencia drop
index

Primary key a nivel de columna


Sintaxis Simplificada:
create table table_name (
column_name datatype
[ NOT NULL | IDENTITY ]
[constraint constraint_name]
primary key [clustered | nonclustered],
...
column_name datatype
[ NULL | NOT NULL | IDENTITY ]
)

Ejemplo:

create table publishers (


pub_id
char(4)
NOT NULL
constraint pky_c_pub_id
primary key,
pub_name
varchar(40) NULL,
city
varchar(20) NULL,
state
char(2)
NULL
)

Primary key a nivel de tabla


Sintaxis Simplificada:
create table table_name (
column_name datatype
[ NULL | NOT NULL | IDENTITY
...
column_name datatype
[ NULL | NOT NULL | IDENTITY
[constraint constraint_name]
primary key (column1 [, column2...])
)

Ejemplo:
create table sales (
stor_id
char(4)
NOT NULL,
ord_num
varchar(20) NOT NULL,
date
datetime
NOT NULL,
constraint pky_c_storid_ordnum
primary key (stor_id, ord_num)
)

],
]

Restriccin unique

Una restriccin unique forza integridad a nivel de entidad


Crea un ndice nico sobre la columna(s) specificada(s)
Asegura integridad durante los inserts y updates
Las tablas pueden tener ms de una restriccin tipo unique

Indices creados con restricin unique

Unico
No-cluster por default
Permite el uso de valores tipo NULL
No se puede borrar usando la sentencia drop
index

Restriccin unique a nivel de columna


Sintaxis Simplificada:
create table table_name (
column_name datatype [ NULL | NOT NULL | IDENTITY
[constraint constraint_name]
unique [clustered | nonclustered],
...
column_name datatype [ NULL | NOT NULL | IDENTITY
)

Ejemplo:

create table publishers (


pub_id
char(4)
NOT NULL,
pub_name
varchar(40) NULL
constraint unq_pub_name
unique,
city
varchar(20) NULL,
state
char(2)
NULL
)

Restriccin unique a nivel de tabla


Sintaxis Simplificada:
create table table_name (
column_name datatype [ NULL | NOT NULL | IDENTITY
...
column_name datatype [ NULL | NOT NULL | IDENTITY
[constraint constraint_name]
unique (column1 [, column2...])
)

Ejemplo:
create table sales (
stor_id
char(4)
NOT NULL,
ord_num
varchar(20) NOT NULL,
date
datetime
NOT NULL,
constraint unq_stor_id_ord_num
unique (stor_id, ord_num)
)

],
]

Restricciones primary key vs unique


What is the
default type of
index?

How many
NULL values
does it allow?

Can you have


more than one
per table?

Primary Key
Constraint

Clustered

None

No

Unique
Constraint

Nonclustered

One

Yes

Integridad referencial
Integridad referencial asegura un valor no se puede
almacenar en una tabla a menos que l exista en otra tabla (o
es NULL)
Ejemplo:
A publisher ID cannot be entered in the titles table unless it
exists in the publishers table

Foreign key
Una foreign key es una combinacin de una o ms
columnas que corresponde(n) a la llave primaria de otra tabla

Restriccin referencial
Una restriccin referencial forza integridad referencial
La integritdad se asegura en inserts, updates, y deletes
Si un insert o update contiene valores de foreign key que no
existen en la(s) column(s) primary key, la sentencia falla
Si un update o delete va a quitar un valor de primary key que
tiene valores foreign key existentes, la sentencia falla

Restriccin referencial a nivel de columna


Sintaxis Simplificada:
create table table_name (
column_name datatype [ NULL | NOT NULL
[constraint constraint_name]
references table_name
(primary_key_column),
...
column_name datatype [ NULL | NOT NULL
)

Ejemplo:

create table titles (


title_id
char(6)
NOT NULL,
title
varchar(80)
NULL,
pub_id
char(4)
NULL
constraint ref_pub_id
references publishers (pub_id),
notes
varchar(200)
NULL
)

| IDENTITY ]

| IDENTITY ]

Restriccin referencial a nivel de tabla


Sintaxis Simplificada:
create table table_name (
column_name
datatype
[ NULL | NOT NULL | IDENTITY ],
...
column_name
datatype
[ NULL | NOT NULL | IDENTITY ],
[constraint constraint_name]
foreign key (list_of_columns_from_this_table)
references table_name (primary_key_column_list) )

Ejemplo:

create table salesdetail (


stor_id
char(4)
NOT NULL,
ord_num
varchar(20) NOT NULL,
title_id
char(6)
NOT NULL,
qty smallint
NOT NULL,
discount
float NOT NULL,
constraint ref_sales
foreign key (stor_id, ord_num)
references sales (stor_id, ord_num) )

Reglas para restriciones referenciales


La(s) columna(s) en la tabla padre que es referenciada en una
tabla hija debe cumplir una de las siguientes condiciones:
Tener una restriccin primary key constraint
Tener una restriccin A unique constraint
Tener indice unico creado con el comando create index

Una restriccin referencial se puede referir a columnas dentro


de la misma tabla
Ejemplo:

create table employees (


emp_id
char(10)
NOT NULL,
name
varchar(40) NOT NULL,
manager
char(10)
NOT NULL
constraint ref_manager
references employees(emp_id)
)

Restricciones sobre valores referenciales


Modificacin de valores sobre una primary key:

No se permite hacer update o delete si el valor existe en


una foreign key
Se permite hacer update o delete si el valor no existe en
una foreign key

Modificacin de valores sobre foreign key:

No se permite insert o update si el nuevo valor no existe


en la correspondiente primary key

Borrado de tablas con primary keys:

No se pueden borrar una tabla si su primary key est


referenciada en una foreign key

Ejemplos de restriccin referencial


Crear la tabla customers con una primary key:
create table customers (
customer_id int
constraint pk_cust primary key,
name
varchar(40)
)

Crear una tabla orders de tal forma que una orden no se


pueda insertar a menos que exista un ID vlido en customer.
Usar una foreign key (customer_id) que se refiera a la primary
de la otra tabla (customers.customer_id):
create table orders (
item_name
varchar(20),
customer_id int
references customers (customer_id)
)

Insertar dos filas en customers:


insert into customers values (101, "Liz Shaw")
insert into customers values (102, "Jo Grant")

Ejecutar estas sentencias (una fallar):


insert into orders values ("widget", 102)
insert into orders values ("gadget", 105)

Cul insert falla? Por qu?


_____________________________________
Ejecutar estas sentencias (una fallar):
delete from customers where name = "Liz Shaw"
delete from customers where name = "Jo Grant"

Cul delete falla? Por qu?


____________________________________
Borrar los objetos de base de datos creados:
drop table orders
drop table customers

Adicin de restricciones
Sintaxis simplificada para aadir:
alter table table_name
add constraint constraint_name
{ check (condition) | primary key (column_list)
| unique (column_list) |
foreign key (column_list) references table
(column_list) }

Ejemplos:

alter table roysched


add constraint chk_hirange_lorange
check (hirange > lorange)
alter table publishers
add constraint pky_pub_id
primary key (pub_id)
alter table titles
add constraint ref_pub_id
foreign key (pub_id)
references publishers(pub_id)

Borrado de restricciones
Sintaxis simplificada para borrado:
alter table table_name
drop constraint constraint_name

Ejemplos:
alter table roysched
drop constraint chk_hirange_lorange
alter table publishers
drop constraint pky_pub_id
alter table publishers
drop constraint unq_pub_name
alter table titles
drop constraint ref_pub_id

Ejemplos de restricciones
Crear una table employees:
create table employees (
emp_id
int,
name
varchar(40),
salary
money
)

Aadir una nueva restriccin a la tabla:


alter table employees
add constraint chk_salary
check (salary between $1 and $70000)

Tratar de insertar un empleado con un dato de


salario invlido:
insert into employees
values (01, "Sarah Jane Smith", 90000)

Borrar los objetos de base de datos creados:


drop table employees
exec sp_dropmessage 20001

Default
Un default es un objeto de base de datos que
proporciona un valor a una columna cuando en un
insert no se especifica un valor para esa columna
Se puede aplicar a una o ms columnas

Crear y asignar defaults


Sintaxis simplificada para Create:
create default default_name as
constant_expression

Ejemplo:
create default def_state as
"CA"

Asignacin del default

Reglas para asignar defaults


Una columna solamente puede tener un default
Si se intenta asignar un default a una columna que ya
tiene un default, ese intento fallar

Una columna con una clusula default no se le


puede asignar un default
Cuando un default se asigna, los datos en la tabla
no se ven afectados
Solamente aplica a los datos que se inserten despus de
que se asigne el default

Quitar y borrar defaults


Quitar un default
Sintaxis simplificada para borrado:
drop default default_name

Ejemplo:
drop default def_state

Rule
Una rule es un objeto de base de datos que no permite
inserts y updates si la regla no se cumple
Como la restriccin check, se puede utilizar para forzar
integridad a nivel de dominio

Una rule se puede asignar a una o ms columnas

Crear reglas
Sintaxis simplificada:
create rule rule_name as
condition_expression

Ejemplos:
create rule rul_state as
@state in ("CA", "CO", "WA")
create rule rul_discount_range as
@discount between 0 and 20
create rule rul_file_date as
@date < 12 or @date > 22
create rule rul_pub_id as
@pub_id in ("1389", "0736", "0877") or
@pub_id like "99[0-9][0-9]"

Asignar reglas
Sintaxis simplificada:
sp_bindrule rule_name, object_name

Ejemplo:
sp_bindrule rul_state, "publishers.state"

Una columna solamente puede tener una rule

Si se asigna una regla a una columna, cualquier regla


asignada con anterioridad pierde validez

Una columna puede tener una restriccin y una rule


asignadas a ella

Los valores deben cumplir ambas condiciones: la restriccin


y la rule en operaciones de insercin o actualizacin

Cuando se asigna una regla, los valore existentes en la tabla


no se ven afectados
Solamente aplica a los datos que inserten despus de que la
regla se asigna

Desasignar y borrar reglas


Desasignar reglas
Sintaxis simplificada para drop :
drop rule rule_name

Ejemplo:
drop rule rul_state

Rules y defaults
Crear una tabla:
create table employees (
emp_id
int,
name
varchar(20)
)

Crear una regla: los ID de los empleados debe ser


mayor que 10:
create rule rul_employee
as @x > 10

Crear un default de 5 para ID de empleado:


create default def_employee
as 5

Asignar nuevos default y rule a la tabla:


sp_bindrule rul_employee,
"employees.emp_id"
exec sp_bindefault def_employee,
"employees.emp_id"

Ejecutar estas sentencias (una fallar):


insert into employees (emp_id, name)
values (20, "Liz Shaw")
insert into employees (name)
values ("Jo Grant")

Cul insert falla? Por qu?

Desasignar el default y la rule:


sp_unbindefault "employees.emp_id"
exec sp_unbindrule "employees.emp_id"

Borrar los objetos de base de datos:


drop default def_employee
drop rule rul_employee
drop table employees

Datatypes definidos por el usuario


Defaults y rules se pueden asignar a datatypes definidos por
el usuario

Las columnas que usen esos datatype aplican el default y


rule que tenga asignado ese datatype
Si el default o rule cambian, se aplican de inmediato
Los datos existentes no se afectan por los cambios

Precedencia de columna y datatype


Si una columna:
Tiene asignado un default, y
Usa un datatype definido por el usuario que tiene un
default diferente, entonces
El default asignado a la columna tiene precedencia

Similarmente, si una columna:


Tiene una rule, y
Usa un datatype definido por el usuario que tiene una
rule diferente, entonces
La rule asignada a la columna tiene precedencia

Mtodos para garantizar integridad de datos


Dos mtodos para implementar integridad de datos
Domain
Integrity

Entity
Integrity

Referential
Integrity

Constraints

Check
constraints

Primary key
References
constraint,
constraints
unique constraint

Database
Objects

Rules

Indexes

Triggers

Resumen de restricciones
Son exigidos en el estndar ANSI
Son especficos a la tabla en que se crean y no son
reutilizables
No se pueden asociar a datatype definidos por el
usuario
Se crean al crear las tablas (o al modificarlas)
Fcilmente se pueden implementar checks
multicolumna

Resumen de defaults y rules

Son extensiones SQL


No son especficos de una tabla y son reutilizables
Se pueden asociar a datatypes de usuario
No se crean al crear la tabla y requieren de etapas
adicionales (creacin y asignacin)
No pueden implementar checks multicolumna

Seleccin de un mtodo
Usar constraints:

Para implementar integridad una tabla


Para cumplir con el ANSI standard
Para restringir el dominio de una columna
Para definir checks entre dos columnas de una fila

Usar objetos de base de datos:


Para implementar integridad que aplica a ms de una
columna, tabla o base de datos
Para asignar rules o defaults datatypes de usuario

Potrebbero piacerti anche