Está en la página 1de 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 categorías:
– DDL (Data definition language)
• create, alter, drop
– DML (Data manipulation language)
• select, insert, update, delete
– DCL (Data control language)
• grant, revoke
Creación de Tablas
Diseño 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 diseñar 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 información 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 precisión requerida
3. Encontrar el datatype que:
– Pueda guardar todos los posibles valores
– Proporcione la exactitud y precisión requeridas
– Use eficientemente el almacenamiento
– Facilite el futuro crecimiento
Categorías de Datatypes
• Números exactos
Números con exactitud y precisión predecibles
• Números aproximados
Números con valores dependiendo de exactitud y precisión del
almacenamiento
• Money
Valores para pesos
• Date y time
Valores de fechas y horas
• Character
Para strings caracteres
• Binary
Información binaria (como imágenes, video y bits)
Ejemplos de Datatypes por Categorías
• Números exactos
integer, numeric (p,s), decimal (p,s)
• Números aproximados
float (p), real, double precision (dependientes de máquina)
• 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 múltiples 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 numéricos, 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
automáticamente valores únicos a cada fila

• Cuando se insertan datos en una tabla, el servidor


automáticamente asigna un número secuencial a la columna
que tiene la propiedad de IDENTITY
Reglas para columnas con IDENTITY

• Sólo puede existir una por tabla


• Debe de ser de tipo numérico 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 [ NULL | NOT NULL | IDENTITY ] ,
...
column_name datatype [ 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) NULL,
departamentotyp_ch_deptid )
Borrar Tablas

• Sintaxis Simplificada para drop:


DROP TABLE table_name

• Ejemplo:
drop table empleado
Cláusula default

• La cláusula default hace que el servidor dé un valor cuando el


valor no se proporciona explícitamente al hacer un insert

• Sintaxis Simplificada :
create table table_name (
column_name datatype default default_value [property],
...)
Modificación de cláusulas 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 añadir cláusulas
default a una tabla
Ejemplo de modificación de cláusulas 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
Adición de Columnas
• Después de creada una tabla, se pueden añadir 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 añadir una columna a una tabla:


alter table table_name
add column_name datatype NULL
[, column_name datatype NULL ...]

• Todas las columnas añadidas 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 extensión 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 cláusula 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 añade 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",
“Nariño")

insert into editor (nombre, pub_id)


values (“Prensa Actual", "2003”)
Extensión SQL para insert
• Se pueden insertar múltiples 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"
Extensión para update

• Se pueden encadenar condiciones en la cláusula 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 = “Nariño"
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"
Extensión para delete
• Se pueden encadenar condiciones en la cláusula
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 operación se ejecuta más rápido 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
• Actúa 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 construcción de consultas complejas
– Simplificar al usuario la percepión 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 au_fname state phone


----- -------- -------- ----- -----
172-32-1176 White Johnson CA 408 496-7223
213-46-8915 Green Marjorie CA 415 986-7020
238-95-7766 Carson Cheryl CA 415 548-7723
267-41-2394 O'Leary Michael CA 408 286-2428
274-80-9391 Straight Dick CA 415 834-2919
...
(15 rows affected)
Modificar datos usando vistas
• Se pueden modificar datos usando vistas si:
– Todas las columnas involucradas están en una tabla
– Todas las columnas no usadas en la vista ni permiten NULLs,
contienen la cláusula 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 están 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 title
-------- -----
New Age Books You Can Combat Computer Stress
New Age Books 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
Opción with check
• with check option restringe cómo se pueden modificar las filas.
Una operación 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 modificación que da error:
update vw_kansas_authors
set state = "MO" where state = "KS"
Reglas para vistas
• La definición de una vista puede incluir:
– Una cláusula where
– Una columna con valores calculados (ej. precio * cant)
– Funciones Agregadas, una cláusula group by, y una cláusula
having
– distinct
– Un join
– Otra vista (hasta 16 niveles)
• Una definición de una vista no puede incluir:
– Una cláusula order by
– Una cláusula 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 vía 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, cuáles 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 búsquda en donde se leen todas las


filas de una tabla
• Una tabla que no tenga índices creados, solamente puede
hacer búsquedas a través de un table scan
Indices

• Un índice es un objeto de base de datos que ayuda al


servidor a encontrar un dato más rápidamente
Estructura de un Indice : Caso de Estudio
authors table
Index pages (data pages)
PAGE
PAGE1241
1241
10 O’Leary
row pg PAGE
11 Ringer
key ptr ptr PAGE1132
1132 12 White
Bennet 1421, 1
13 Jenkins
PAGE
PAGE1007 Chan 1129, 3
row pg 1007
PAGE
PAGE1242
key ptr ptr
Bennet 1421, 1 1132 Dull 1409, 1
14
1242
Hunter
Greane 1242, 4 1133 Edwards 1018, 5
PAGE 15 Smith
PAGE1001
1001 Hunter 1242, 1 1127 16 Ringer
Bennet 1421, 1 1007 PAGE
PAGE1133
1133
Greane 1242, 4 17 Greane
Karsen 1876, 1 1305
Green 1421, 2 PAGE
PAGE1421
1421
Smith 1242, 1 1062
PAGE
PAGE1305
1305 Greene 1409, 2 18 Bennet
Karsen 1876, 1 1311 19 Green
20 Ringer
PAGE
PAGE1127
1127
Hunter 1242, 1 PAGE
PAGE1409
1409
Jenkins 1241, 4 21 Dull
(more pages) 22 Greene
23 White
create index idx_authors_2
(more pages) (more pages)
on authors(au_lname)
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 número de columnas sobre las cuales se declara el índice
• Una columna – índice no-compuesto
• Múltiples 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 están o no ordenados los datos en la tabla por el concepto del
índice cuando la tabla se crea
• Datos ordenados durante la creación - índice cluster
• Datos no ordenados durante la creación - í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
más columnas
– Ejemplo:
create index idx_authors_3
on authors(au_lname, au_fname)
• Apropiado cuando las consultas se hacen sobre
múltiples 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 authors table
(data pages)
root level intermediate level leaf level PAGE
PAGE1241
1241
key row ptr 10 O’Leary
row pg PAGE
11 Ringer
key ptr ptr PAGE1132
1132 12 White
Bennet 1421, 1
13 Jenkins
PAGE
PAGE1007 Chan 1129, 3
row pg Bennet 1421, 1
1007
1132 Dull 1409, 1
PAGE
PAGE1242
1242
key ptr ptr Greane 1242, 4 1133 Edwards 1018, 5
14 Hunter
15 Smith
PAGE
PAGE1001
1001 Hunter 1242, 1 1127 16 Ringer
PAGE
PAGE1133
1133
Bennet 1421, 1 1007 17 Greane
Greane 1242, 4
Karsen 1876, 1 1305 PAGE
Green 1421, 2 PAGE1421
1421
Smith 1242, 1 1062 PAGE
PAGE1305
1305 18 Bennet
Greene 1409, 2
Karsen 1876, 1 1311 19 Green
20 Ringer
PAGE
PAGE1127
1127
Hunter 1242, 1 PAGE
PAGE1409
1409
Jenkins 1241, 4 21 Dull
(more pages) 22 Greene
23 White
create index idx_authors_2
(more pages) (more pages)
on authors(au_lname)
Indice cluster
• Un índice cluster es un índice que, cuando se crea, indica cómo
están físicamente almacenados los datos en la tabla
– Ejemplo:
create clustered index idx_c_authors_1
on authors(au_id)
• Una tabla sólo puede contener un índice cluster
• Típicamente 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 modificación de los
datos de una tabla
– Esta reducción se debe a que se deben almacenar físicamente los
datos ordenados
Etructura de un índice cluster
Index pages authors table
(leaf/data pages)
root level intermediate level PAGE
PAGE1241
1241
10 Bennet
11 Chan
key pg ptr 12 Dull
13 Edwards
PAGE
PAGE1007
1007
PAGE
PAGE1242
1242
Bennet 1241
key pg ptr Greane 1242
14 Greane
15 Green
PAGE
PAGE1001
1001 Hunter 1421 16 Greene
Bennet 1007 17
Karsen 1305 PAGE
PAGE1421
1421
Smith 1062 PAGE
PAGE1305
1305 18 Hunter
Karsen 1409 19 Jenkins
20

PAGE
PAGE1409
1409
21 Karsen
(more pages) 22 O'Leary
23 Ringer
create clustered index idx_authors_2
on authors(au_lname) (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 cláusula 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 cláusula 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
• Típicamente existen dos tipos de tablas temporales:
– Compartidas (Shareable)
– De sesión específica
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 eliminación de valores
• Para almacenar resultados intermedios de consultas que tienen
la cláusula compute o agregadas
Tablas del sistema

• Una tabla del sistema es una tabla creada y


mantenida por el servidor que almacena
información 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 válidos para esa columna
• integridad a nivel de entidad
– Asegura que cualquier fila de una tabla puede identificarse
inequívocamente
• integridad referencial
– Asegura que un determinado valor no puede escribirse en una
tabla si ese valor no existe en otra tabla
Dos métodos para forzar integridad

Domain Entity Integrity Referential


Integrity Integrity

Constraints Check Primary key References


constraints constraints, constraints
unique
constraints
Database Rules Indexes Triggers
Objects
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 también 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
Restricción 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
Restricción 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 restricción a nivel de columna

• Si un usuario no da el nombre de una restricción a nivel de


columna, el servidor genera uno
• Para simplificar la administración, el usuario debería escribir el
nombre de todos los constraints
– El nombre de un Constraint debe ser único a nivel de la base de
datos
Restricción 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) NULL,
lowqty smallint NULL,
highqty smallint NULL,
discount float NOT NULL,
constraint chk_low_high
check (lowqty <= highqty)
)
Restricciones y defaults
• Los servidores permiten que una tabla tenga default y check
sin que haya contradicción
• 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 inequívoca
Primary key
• Combinación de una o más columnas que identifican de
manera inequívoca una fila en una tabla
Restricción primary key
• Una restricción 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
• Sólo 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)
)
Restricción unique
• Una restricción 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 más de una restricción tipo unique
Indices creados con restrición unique

• Unico
• No-cluster por default
• Permite el uso de valores tipo NULL
• No se puede borrar usando la sentencia drop
index
Restricción 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
)
Restricción 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 How many Can you have


default type of NULL values more than one
index? does it allow? per table?

Primary Key Clustered None No


Constraint

Unique Nonclustered One Yes


Constraint
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 combinación de una o más columnas


que corresponde(n) a la llave primaria de otra tabla
Restricción referencial
• Una restricción 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
Restricción referencial a nivel de columna
• Sintaxis Simplificada:
create table table_name (
column_name datatype [ NULL | NOT NULL | IDENTITY ]
[constraint constraint_name]
references table_name
(primary_key_column),
...
column_name datatype [ NULL | NOT NULL | IDENTITY ]
)
• 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
)
Restricción 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 restricción primary key constraint
– Tener una restricción A unique constraint
– Tener indice unico creado con el comando create index
• Una restricción 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
• Modificación 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
• Modificación 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 restricción 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 válido 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)
• ¿Cuál insert falla? ¿Por qué?
_____________________________________
• Ejecutar estas sentencias (una fallará):
delete from customers where name = "Liz Shaw"
delete from customers where name = "Jo Grant"
• ¿Cuál delete falla? ¿Por qué?
____________________________________
• Borrar los objetos de base de datos creados:
drop table orders
drop table customers
Adición de restricciones
• Sintaxis simplificada para añadir:
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
)
• Añadir una nueva restricción 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 inválido:
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 más columnas
Crear y asignar defaults

• Sintaxis simplificada para Create:


create default default_name as
constant_expression
• Ejemplo:
create default def_state as
"CA"

• Asignación 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 cláusula 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 después 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 restricción check, se puede utilizar para forzar
integridad a nivel de dominio
• Una rule se puede asignar a una o más 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 restricción y una rule
asignadas a ella
– Los valores deben cumplir ambas condiciones: la restricción
y la rule en operaciones de inserción o actualización
• Cuando se asigna una regla, los valore existentes en la tabla
no se ven afectados
– Solamente aplica a los datos que inserten después 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")
• ¿Cuál 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
Métodos para garantizar integridad de datos
• Dos métodos para implementar integridad de datos

Domain Entity Referential


Integrity Integrity Integrity

Constraints Check Primary key References


constraints constraint, constraints
unique constraint

Database Rules Indexes Triggers


Objects
Resumen de restricciones
• Son exigidos en el estándar ANSI
• Son específicos 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)
• Fácilmente se pueden implementar checks
multicolumna
Resumen de defaults y rules

• Son extensiones SQL


• No son específicos 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 (creación y asignación)
• No pueden implementar checks multicolumna
Selección de un método
• 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 más de una
columna, tabla o base de datos
– Para asignar rules o defaults datatypes de usuario

También podría gustarte