Logo Studenta

Transact Microsoft SQLServer2000_01 pdf

¡Este material tiene más páginas!

Vista previa del material en texto

1 
 
Microsoft SQL Server 2000 (Parte I) 
Transact-SQL 
 
Ing. MCSD.NET Jorge M. Rodríguez Castro
 
 
 
 
Diapositiva 46 
 
En esta dispositiva se crea una tabla denominada Empleado, la cual contiene campos a los que se les asigna tipos de 
datos básicos y se determina si admitirán o no valores nulos. 
 
Como se aprecia, la columna Dni se ha especificado como char(8) NOT NULL. En la Diapositiva 44.Creando y 
eliminando tipos de datos se muestra cómo crear tipos de datos personalizados a través del procedimiento 
almacenado de sistema sp_addtype. Si deseamos mantener las características del campo Dni, pero a través de un 
tipo de dato personalizado podríamos hacer lo siguiente: 
 
EXEC sp_addtype TipoDNI, 'char(8)', 'NOT NULL' 
GO 
CREATE TABLE Empleado 
( 
 Codigo int NOT NULL, 
 Nombre char(40) NOT NULL, 
 Direccion varchar(40) NULL, 
 FechaNac smalldatetime NOT NULL, 
 Sexo char(1) NOT NULL, 
 Dni TipoDNI, 
 Salario smallmoney NOT NULL 
) 
 
Con el procedimiento almacenado se ha creado el tipo TipoDNI, asignado como tipo a la columna Dni. Téngase en 
cuenta que no es posible eliminar un tipo de dato definido por el usuario mientras éste se encuentre asignado a algún 
campo de una tabla existente en la base de datos. 
 
Importante 
 
Al ejecutar sp_addtype se crea un tipo de datos definido por el usuario que se agrega a la tabla del sistema 
systypes de una base de datos concreta, a menos que sp_addtype se ejecute con master como la base de 
datos actual. Si el tipo de datos definido por el usuario tiene que estar disponible en todas las nuevas bases 
de datos definidas por el usuario, agréguelo a la base de datos model. 
 
Investigar 
 
 SET ANSI_NULL_DFLT_ON 
 SET ANSI_NULL_DFLT_OFF 
 SET ANSI_NULLS 
 SET CONCAT_NULL_YIELDS_NULL 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
mailto:jorgerodcas@hotmail.com
 2 
 
Diapositiva 47 
 
Es posible que en algún momento tengamos la necesidad de alterar la estructura de una tabla existente, para lo cual 
analizaremos las siguientes sentencias: 
 
ALTER TABLE Empleado 
ADD Telefono char(6) NULL 
 
En este caso estamos adicionando la columna Telefono a la tabla Empleado. Téngase en cuenta que esta columna 
admitirá valores nulos. Si deseamos que una columna nueva no admita valores nulos debemos establecer un valor por 
defecto para la nueva columna. 
 
ALTER TABLE Empleado 
ADD FechaIngreso smalldatetime NOT NULL DEFAULT GETDATE() 
 
La restricción Default en este caso sólo nos ha servido para agregar una columna que no admita valores nulos, por 
tanto, no tiene un fin práctico a futuro. Más adelante veremos cómo podemos eliminar esta restricción de la definición 
de la base de datos. La sentencia de eliminación de una columna se muestra en la diapositiva. 
 
Importante 
 
Si la tabla ya tiene filas, adicionar una columna que admita valores nulos provocará que se inserte el valor 
NULL en dicha columna para cada registro existente. Si se adiciona una columna que no admita valores nulos 
utilizando la restricción DEFAULT (valor por defecto), entonces se insertará el valor predeterminado 
establecido en la columna respectiva para cada registro existente. 
Debe tener en cuenta también que no es posible eliminar directamente una columna que tiene asociada una 
restricción en su definición. Debe primero eliminarse la restricción asociada a la columna. 
 
 
 
Diapositiva 48 
 
En SQL Server existen dos maneras de poder generar valores automáticamente para una columna: usando la 
propiedad IDENTITY y el tipo de datos UNIQUEIDENTIFIER. Veamos a detalle cada uno de ellos: 
 
 
IDENTITY 
Crea una columna de identidad en una tabla. Una columna de identidad permite que SQL Server genere y asigne un 
valor numérico entero consecutivo a cada fila nueva de una tabla. Se consideran dos valores en su definición: un valor 
inicial y un valor de incremento. 
Ejemplo: 
 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 3 
CREATE TABLE Producto 
( 
 IdProducto int IDENTITY(1,1), 
 NombreProducto varchar(30) NOT NULL 
) 
 
 
IDENTITY(1,1) para la columna IdProducto insertará por cada nuevo registro un valor entero que se iniciará en 1 
(primer argumento de IDENTITY) y se incrementará también en una unidad (segundo argumento de IDENTITY). Si 
luego de creada la tabla ejecutamos las siguientes sentencias: 
 
INSERT INTO Producto VALUES('LECHE GLORIA') 
INSERT INTO Producto VALUES('ARROZ COSTEÑO') 
INSERT INTO Producto VALUES('GALLETAS CHARADA') 
INSERT INTO Producto VALUES('CHAMPÚ PANTENE') 
SELECT * FROM Producto 
 
 
Obtenemos el siguiente resultado: 
 
IdProducto NombreProducto 
----------- ------------------------------ 
1 LECHE GLORIA 
2 ARROZ COSTEÑO 
3 GALLETAS CHARADA 
4 CHAMPÚ PANTENE 
 
(4 filas afectadas) 
 
Importante 
 
Los argumentos para IDENTITY(inicial, incremento) son opcionales si se inician en 1 y se incrementan en 1. 
Estos valores se asignan por defecto cuando se omiten en la definición IDENTITY. Además, es posible incluir 
valores negativos como argumentos. 
 
Investigación 
 
 SET IDENTITY_INSERT 
 DBCC CHECKIDENT 
 @@IDENTITY 
 IDENT_CURRENT 
 IDENTITY (Función) 
. Una columna o una variable local de UNIQUEIDENTIFIER se pueden inicializar 
on n tas: 
 
 C
 M xxxxxxxx-xxxx-xxxx-xxxx-
xxxxxxxxxxxx, en el que cada x es un dígito hexadecimal del intervalo 0-9 o A-F). Por ejemplo, un valor 
e para UNIQUEIDENTIFIER sería 6F9619FF-8B86-D011-B42D-00C04FC964FF. 
 
Ejemp
 
 IDENT_INCR 
 IDENT_SEED 
 SCOPE_IDENTITY 
 
 
 
UNIQUEIDENTIFIER 
s un Identificador Único Global (GUID)E
c u valor de dos formas distin
on la función NEWID(). 
ediante una conversión desde una constante de cadena con el siguiente formato (
posibl
lo: 
CREATE TABLE Producto 
( 
 IdProducto UNIQUEIDENTIFIER, 
 NombreProducto varchar(30) NOT NULL 
) 
 GO 
INSERT INTO Producto VALUES(NEWID(),'LECHE GLORIA') 
INSERT INTO Producto VALUES(NEWID(),'ARROZ COSTEÑO') 
INSERT INTO Producto VALUES(NEWID(),'GALLETAS CHARADA') 
INSERT INTO Producto VALUES('6F9619FF-8B86-D011-B42D-00C04FC964FF','CHAMPÚ HS') 
 
SELECT * FROM Producto 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 4 
 
O
 
btenemos el siguiente resultado: 
IdProducto NombreProducto 
------------------------------------ ------------------------------ 
B8BCEE80-FC6E-11D6-89DC-90CF41795C18 LECHE GLORIA 
B8BCEE81-FC6E-11D6-89DC-90CF41795C18 ARROZ COSTEÑO 
B8BCEE82-FC6E-11D6-89DC-90CF41795C18 GALLETAS CHARADA 
6F9619FF-8B86-D011-B42D-00C04FC964FF CHAMPÚ HS 
 
(4 filas afectadas) 
cias INSERT hemos invocado a la función NEWID() que es la encargada de generar un 
na forma de evitar la inclusión de NEWID() en cada sentencia INSERT es incluyéndola en la definición de la tabla 
ediante una restricción de valor por defecto: 
 
 
 
 
En las tres primeras senten
valor único de tipo UNIQUEIDENTIFIER, en la última sentencia hemos preferido incluir un valor propio, respetando el 
formato del tipo de datos. 
U
m
CREATE TABLE Producto 
( 
 IdProducto UNIQUEIDENTIFIER DEFAULT NEWID(), 
 NombreProducto varchar(30) NOT NULL 
) 
 
INSERT INTO Producto (NombreProducto)VALUES('LECHE GLORIA') 
INSERT INTO Producto (NombreProducto)VALUES('ARROZ COSTEÑO') 
INSERT INTO Producto VALUES(DEFAULT, 'GALLETAS CHARADA') 
INSERT INTO Producto VALUES(DEFAULT, 'CHAMPÚ PANTENE') 
 
SELECT * FROM Producto 
 
Obtenemos el siguiente resultado: 
 
 
IdProducto NombreProducto 
------------------------------------ ------------------------------ 
B8BCEE84-FC6E-11D6-89DC-90CF41795C18 LECHE GLORIA 
B8BCEE85-FC6E-11D6-89DC-90CF41795C18 ARROZ COSTEÑO 
B8BCEE86-FC6E-11D6-89DC-90CF41795C18 GALLETAS CHARADA 
B8BCEE87-FC6E-11D6-89DC-90CF41795C18 CHAMPÚ PANTENE 
 
(4 filas afectadas) 
 
Nótese la forma en que se han construido las sentencias INSERT. Las dos primeras especifican en qué columna se 
insertarán los valoresespecificados; en cambio, en las dos últimas hemos convenido en colocar la cláusula DEFAULT 
n representación de la primera columna de cada registro. En ambos casos se generan valor UNIQUEIDENTIFIER a 
ión NEWID establecida en la definición de la tabla como valor por defecto. 
 
Investigació
 
 LIMITACIONES DE U
 
 
e
través de la func
n 
NIQUEIDENTIFIER. 
 
Diapositiva 49 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 5 
 
Caso práctico: 
Luis ha creado su base de datos, pero ha eliminado por error el script de creación de la base, el cual contenía las 
definiciones de tablas, restricciones, etc. El se pregunta si xiste la forma de poder obtener nuevamente el script. La 
spuesta es SÍ. ¿Cómo? 
 
dor Corporativo y haga clic derecho sobre la base de datos para la cual desea generar el script. 
eleccione la opción Todas las tareas y dentro de ella la opción Generar secuencia de comandos SQL, como se 
indica en la figura. 
 
 e
re
 
Paso 1 
Inicie el Administra
S
 
 las casillas de 
verificación según las opciones de formato que desea pa el script. En la ficha Opciones habilite las casillas de 
verificación según conv . 
 
 
Paso 2 
En el diálogo mostrado haga clic sobre el botón Mostrar Todo. En la ficha General Habilite las casillas de verificación 
de aquellos objetos de base de datos que se incluirán en el script. En la ficha Formato habilite
ra
enga tanto para seguridad como para tabla. Finalmente, haga clic en Aceptar
 
 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 6 
 
Paso 3 
Asigne un nombre y una ubicación al archivo de script. SQL Server informará acerca del resultado de la generación. 
De
 
sde el Analizador de Consultas abra el archivo para comprobar la correcta generación del script. 
 
 
Investigació
 
 sp_dboption 
 
 
 
n 
 
Diapositiva 55 
 
Una restricción DEFAULT asigna un valor por defecto a un campo cuando el usuario no lo proporciona. 
Ejemplos: 
 
 
CREATE TABLE Producto 
( 
 IdProducto int NOT NULL, 
 NombreProducto varchar(30) NOT NULL, 
 FechaIngreso smalldatetime DEFAULT GETDATE() 
) 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 7 
 
Se ha definido la columna FechaIngreso y se le ha atribuido como valor por defecto la fecha y hora del sistema a 
avés de la función GETDATE(). 
i la tabla ya está creada y se desea agregar una restricción DEFAULT a alguna columna utilizamos ALTER TABLE: 
 
tr
 
S
CREATE TABLE Producto 
( 
 IdProducto int NOT NULL, 
 NombreProducto varchar(30) NOT NULL, 
 FechaIngreso smalldatetime NOT NULL, 
) 
ALTER TABLE Producto 
ADD DEFAULT GETDATE() FOR FechaIngreso 
 
Para insertar registros en la tabla podemos optar por varias formas: 
 
-- Ingresar explícitamente un valor para la columna Fecha de ingreso. 
-- La restricción DEFAULT es obviada 
INSERT INTO Producto VALUES(13,'GALLETAS CHARADA','05/08/2002') 
 
-- Se utiliza la cláusula DEFAULT para asignar el valor por defecto establecido 
-- en la definición. Es una invocación explícita a la restricción. 
INSERT INTO Producto VALUES(23,'LECHE GLORIA',DEFAULT) 
 
-- Se especifica cada una de las columnas que recibirán valores 
-- Al obviarse la columna FechaIngreso SQL Server carga 
-- el valor por defecto definido para dicha columna. 
INSERT INTO Producto (IdProducto, NombreProducto)VALUES(11,'ARROZ COSTEÑO') 
Importante 
la única manera de modificar algún objeto de base de datos es refiriéndonos a él a 
través de su nombre. 
ber qué nombre se le ha asignado a la restricción 
EFAULT creada, entonces ejecutaremos la siguiente sentencia: 
 
 
 
 
Una restricción es un objeto más dentro de una base de datos, por tanto, una restricción tiene un nombre que 
la identifica y distingue del resto de objetos definidos. Cuando creamos una restricción y no le asignamos un 
nombre, SQL Server le asigna automáticamente uno. Esta puede ser una ventaja para no preocuparnos de 
asignar nombres a las restricciones, pero representa un problema cuando deseamos administrar dicha 
restricción, dado que 
 
 
Para poder saber qué nombre se le ha asignado a una restricción podemos hacer uso del procedimiento almacenado 
sp_helpconstraint. Según el ejemplo anterior, si deseamos sa
D
EXEC sp_helpconstraint Producto 
 
 
Y obtendríamos como respuesta: 
 
 
 
icción DEFAULT creada. Podemos utilizar este 
ombre para referirnos al objeto y modificar su definición o eliminarlo. 
ara eliminar una restricción ejecutamos: 
 
 
La columna constraint_name muestra el nombre asignado a la restr
n
 
 
P
ALTER TABLE Producto 
DROP DF__Producto__FechaI__182C9B23 
 
 ó
 
ALTER TABLE Producto 
DROP CONSTRAINT DF__Producto__FechaI__182C9B23 
 
 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 8 
Podemos crear restricciones y asignarles un nombre de diversas formas: 
 
 Al mo
 
mento de crear la tabla 
CREATE TABLE Producto 
( 
 IdProducto int NOT NULL, 
 NombreProducto varchar(30) NOT NULL, 
 FechaIngreso smalldatetime NOT NULL 
CONSTRAINT DF_Producto_FechaIngreso DEFAULT GETDATE(), 
) 
 
 Agr la ya creada 
 
egando la restricción a una tab
CREATE TABLE Producto 
( 
 IdProducto int NOT NULL, 
 NombreProducto varchar(30) NOT NULL, 
 FechaIngreso smalldatetime NOT NULL, 
) 
 
ALTER TABLE Producto 
ADD CONSTRAINT DF_Producto_FechaIngreso DEFAULT
 
 GETDATE() FOR FechaIngreso 
ara elimi ne nombre ejecutamos: 
 
P nar esta restricción que ya tie
ALTER TABLE Producto 
DROP DF_Producto_FechaIngreso 
 
ó 
 
ALTER TABLE Producto 
DROP CONSTRAINT DF_Producto_FechaIngreso 
ota: Cualquier restricción se puede crear bajo las mismas consideraciones descritas anteriormente. 
 
 
 
N
 
 
 
ue exige la integridad del dominio al limitar los valores posibles que se 
ribir en una o varias columnas. 
jemplos: 
 
Diapositiva 56 
 
Una restricción CHECK es una condición q
pueden esc
 
E
CREATE TABLE Cliente 
( 
 Dni char(8) NOT NULL, 
 Nombre varchar(30) NOT NULL, 
 Apellidos varchar(40) NOT NULL, 
 Sexo char(1) NOT NULL, 
 Salario smallmoney NOT NULL, 
 
 CONSTRAINT CK_Cliente_Dni CHECK 
(Dni LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 9 
 CONSTRAINT CK_Cliente_Sexo CHECK (Sexo IN ('M','F')), 
 CONSTRAINT CK_Cliente_Salario CHECK (Salario>0 And Salario<=2500) 
) 
 
-- La primera restricción exige que todo Dni cumpla con: tener una longitud de 
-- ocho caracteres y que cada caracter sea numérico. 
-- La segunda exige que el valor de la columna Sexo sea ‘M’ o ‘F’. No se admitirá 
-- otro valor. La tercera restricción asegura que el Salario tenga 
-- un valor positivo que no exceda a 2500. 
varán las restricciones CHECK para comprobar que los valores de 
lumna cumplan con las definiciones de validación. 
ambién puede definir las restricciones al momento de definir cada campo de la tabla: 
 
 
Cuando el usuario inserte registros en la tabla se acti
co
 
T
-- SQL Server asignará nombres a las restricciones 
CREATE TABLE Cliente 
( 
 Dni char(8) NOT NULL 
CHECK(Dni LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), 
 Nombre varchar(30) NOT NULL, 
 Apellidos varchar(40) NOT NULL, 
 Sexo char(1) NOT NULL CHECK (Sexo IN ('M','F')), 
 Salario smallmoney NOT NULL CHECK (Salario>0 And Salario<=2500) 
) 
 -- Restricciones con nombre asignado por el usuario 
CREATE TABLE Cliente 
( 
 Dni char(8) NOT NULL CONSTRAINT CK_Cliente_Dni CHECK 
(Dni LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), 
 Nombre varchar(30) NOT NULL, 
 Apellidos varchar(40) NOT NULL, 
 Sexo char(1) NOT NULL CONSTRAINT CK_Cliente_Sexo CHECK (Sexo IN ('M','F')), 
 Sala INT CK_Cliente_Salario CHECK rio smallmoney NOT NULL CONSTRA
(Salario>0 And Salario<=2500) 
) 
 
Es posible crear una restricción CHECK en la que se confronten varias columnas de la tabla. En el siguiente ejemplo se 
confrontan las columnas FechaPrestamo y FechaDevolucion, exigiendo que ésta última tenga un valor mayor igual 
 la primera: 
 
a
CREATE TABLE Alquiler( 
 Numero int, 
 IdCliente char(8) NOT NULL, 
 FechaPrestamo smalldatetime NOT NULL, 
 FechaDevolucion smalldatetime NOT NULL, 
 
 CONSTRAINT CK_Alquiler_ControlFechas CHECK (FechaDevolucion>=FechaPrestamo) 
) 
or tanto, una sentencia INSERT como la siguiente generaría un error: 
 
 
P
-- Fecha de préstamo: 5 de diciembre 
-- Fecha de devolución: 4 de diciembre. Imposible !!! 
INSERT INTO Alquiler VALUES(42,'12547818','05/12/2002','04/12/2002') 
 
Debe tenerse muy en cuenta que esta práctica requiere que la restricción se cree luego de la definición de las 
lumnas involucradas. 
Importante 
 recomienda asignarles nombres al crearlas, debido a que esta práctica facilitará en el 
futuro su tratamiento. 
 
co
 
 
 
Aunque es fácil obtener los nombres de las restricciones utilizando el procedimiento almacenado 
sp_helpconstraint, se
 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 10
 
Diapositiva 57 
(Leer características de las restricciones PRIMARY KEY en la diapositiva) 
 
Una restricción PRIMARY KEY garantiza que se cumplan dos restricciones del Modelo Relacional: la restricción de 
clave y la restricción de dominio. A continuación se muestran cuatro formas distintas de incluir en la definición de una 
tabla una restricción de clave primaria: 
 
-- Ejemplo 1. Al crear una columna. Con nombre de restricción dada por SQL Server. 
CREATE TABLE Producto 
( 
 IdProducto int NOT NULL PRIMARY KEY, 
 NombreProducto varchar(30) NOT NULL, 
 FechaIngreso smalldatetime NOT NULL, 
) 
 
-- Ejemplo 2. Al crear una columna. Con nombre de restricción dada por el usuario. 
CREATE TABLE Producto 
( 
 IdProducto int NOT NULL CONSTRAINT PK_Producto PRIMARY KEY, 
 NombreProducto varchar(30) NOT NULL, 
 FechaIngreso smalldatetime NOT NULL, 
) 
 
-- Ejemplo 3. Creando la restricción en una línea aparte. Con nombre de restricción 
-- dada por SQL Server. 
CREATE TABLE Producto 
( 
 IdProducto int NOT NULL, 
 NombreProducto varchar(30) NOT NULL, 
 FechaIngreso smalldatetime NOT NULL, 
 
 CONSTRAINT PK_Producto PRIMARY KEY (IdProducto) 
) 
 
-- Ejemplo 4. Creando la restricción en una línea aparte. Con nombre de restricción 
-- dada por el usuario. 
CREATE TABLE Producto 
( 
 IdProducto int NOT NULL, 
 NombreProducto varchar(30) NOT NULL, 
 FechaIngreso smalldatetime NOT NULL, 
) 
ALTER TABLE Producto 
ADD CONSTRAINT PK_Producto PRIMARY KEY (IdProducto) 
 
La asignación de una restricción PRIMARY KEY sobre una columna hace innecesaria la inclusión de NOT NULL. 
Una restricción PRIMARY KEY puede abarcar más de una columna. Véase el siguiente ejemplo: 
 
CREATE TABLE Matricula 
( 
 IdCurso int NOT NULL, 
 IdAlumno char(8) NOT NULL, 
 FechaMat smalldatetime NOT NULL, 
 TipoPago char(1) NOT NULL DEFAULT 'C', 
 CONSTRAINT PK_Matricula PRIMARY KEY (IdCurso, IdAlumno) 
) 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 11
 
 
Si se define una restricción PRIMARY KEY para más de una columna, puede haber valores duplicados dentro de la 
misma columna pero la combinación de valores de todas las columnas de la definición de la restricción PRIMARY KEY 
debe ser única en la tabla. Basados en la tabla creada anteriormente analice las siguientes sentencias: 
 
-- Sentencias INSERT son válidas 
INSERT INTO Matricula VALUES(24,'AE-52144','14/08/2002',DEFAULT) 
INSERT INTO Matricula VALUES(16,'AE-52144','22/09/2002',DEFAULT) 
INSERT INTO Matricula VALUES(24,'FD-55019','13/09/2002','P') 
-- Esta sentencia generaría un error 
INSERT INTO Matricula VALUES(16,'AE-52144','24/08/2002',DEFAULT) 
 
Importante 
 
Es posible agregar una restricción PRIMARY KEY cuando la tabla ya contiene registros, sólo debe tenerse en 
cuenta que no deben existir valores duplicados ni valores nulos en la columna(s) que conformen la restricción. 
Estas reglas deben cumplirse estrictamente. 
 
 
 
 
Diapositiva 58 
(Leer características de las restricciones PRIMARY KEY en la diapositiva) 
 
Cuando deseamos que en una columna no existan valores repetidos, pero no se necesita que sea clave primaria, 
podemos aplicar sobre dicha columna una restricción UNIQUE. La diferencia con una restricción PRIMARY KEY es 
que una restricción UNIQUE admite el valor nulo. 
 
A continuación se muestran cuatro formas distintas de incluir en la definición de una tabla una restricción UNIQUE: 
 
-- Ejemplo 1 
CREATE TABLE Alumno 
( 
 Codigo char(6) NOT NULL PRIMARY KEY, 
 Nombre varchar(20) NOT NULL UNIQUE, 
 Direccion varchar(30) NOT NULL, 
 FechaNac smalldatetime NOT NULL, 
) 
-- Ejemplo 2 
CREATE TABLE Alumno 
( 
 Codigo char(6) NOT NULL PRIMARY KEY, 
 Nombre varchar(20) NOT NULL CONSTRAINT UQ_Alumno_Nombre UNIQUE, 
 Direccion varchar(30) NOT NULL, 
 FechaNac smalldatetime NOT NULL, 
) 
-- Ejemplo 3 
CREATE TABLE Alumno 
( 
 Codigo char(6) NOT NULL PRIMARY KEY, 
 Nombre varchar(20) NOT NULL, 
 Direccion varchar(30) NOT NULL, 
 FechaNac smalldatetime NOT NULL, 
 
 CONSTRAINT UQ_Alumno_Nombre UNIQUE(Nombre) 
) 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 12
-- Ejemplo 4 
CREATE TABLE Alumno 
( 
 Codigo char(6) NOT NULL PRIMARY KEY, 
 Nombre varchar(20) NOT NULL, 
 Direccion varchar(30) NOT NULL, 
 FechaNac smalldatetime NOT NULL, 
) 
ALTER TABLE Alumno 
ADD CONSTRAINT UQ_Alumno_Nombre UNIQUE(Nombre) 
 
-- Sentencias válidas 
INSERT INTO Alumno VALUES('A-4586','JUAN MENDOZA','IZAGA 230','14/07/1976') 
INSERT INTO Alumno VALUES('A-1805','RAFAEL JIMENEZ','BALTA 354','12/06/1977') 
 
-- Sentencia INSERT que infringe la restricción UNIQUE 
INSERT INTO Alumno VALUES('F-2258','JUAN MENDOZA','GRAU 756','22/01/1976') 
 
 
Al igual que una restricción PRIMARY KEY, puede asignar una restricción UNIQUE a un conjunto de columnas. 
Analice el siguiente ejemplo: 
 
 
CREATE TABLE Alumno 
( 
 Codigo char(6) NOT NULL PRIMARY KEY, 
 Nombre varchar(20) NOT NULL, 
 Apellido varchar(30) NOT NULL, 
 Direccion varchar(30) NOT NULL, 
 FechaNac smalldatetime NOT NULL, 
 
 CONSTRAINT UQ_Alumno_NombreApellido UNIQUE(Nombre,Apellido) 
) 
 
-- Sentencias válidas 
INSERT INTO Alumno VALUES('A-4586','JUAN','MENDOZA','IZAGA 230','14/07/1976') 
INSERT INTO Alumno VALUES('A-1805','RAFAEL','JIMENEZ','BALTA 354','12/06/1977') 
-- Sentencia INSERT que infringe la restricción UNIQUE 
INSERT INTO Alumno VALUES('F-2258','JUAN','MENDOZA','GRAU 756','22/01/1976') 
 
 
 
Diapositiva 59 
(Leer características de las restricciones PRIMARY KEY en la diapositiva) 
 
Una restricción de tipo FOREIGN KEY permite establecer relaciones entre tablas. Analice los siguientes ejemplos: 
 
Ejemplo 1 
Tablas Cliente y Cuenta, creadas bajo el supuesto que un cliente puede tener varias cuentas, pero una cuenta 
pertenece a un solo cliente: 
 
 
CREATE TABLE Cliente 
( 
 DNI char(8) NOT NULL, 
 Nombre varchar(30) NOT NULL, 
 Apellidos varchar(40) NOT NULL, 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 13
 Direccion varchar(10) NOT NULL, 
 Telefono varchar(10) NULL, 
 
 CONSTRAINT PK_Cliente PRIMARY KEY (DNI) 
) 
CREATE TABLE Cuenta 
( 
 Numero int NOT NULL, 
 Saldo float NOT NULL DEFAULT 800, 
 TipoMoneda char(1) DEFAULT 'S', 
 DNI_Propietario char(8) NOT NULL, 
 
 CONSTRAINT PK_Cuenta PRIMARY KEY (Numero), 
 CONSTRAINT FK_Cuenta_Cliente 
FOREIGN KEY (DNI_Propietario) REFERENCES Cliente(DNI) 
) 
 
 
 
 
 
Observe que en la definición de la tabla CUENTA se ha creado la columna DNI_Propietario, la que tiene que tener el 
mismo tipo y longitud que la columna DNI de la tabla CLIENTE para poder establecer una restricción FOREIGN KEY 
entre ellas. Las columnas pueden tener el mismo identificador en ambas tablas; es decir, llamarse DNI tanto en 
CLIENTE como en CUENTA. 
 
 
Ejemplo 2 
Un alumno puede matricularse en más de un curso, y un curso puede tener más de un alumno matriculado. Se ha 
creado una tabla intersección Cursa y está referenciada por las dos anteriores. 
 
CREATE TABLE Alumno 
( 
 CodigoA char(6) NOT NULL, 
 Nombre varchar(20) NULL, 
 Direccion varchar(30) NOT NULL, 
 FechaNacsmalldatetime NOT NULL, 
 
 CONSTRAINT PK_Alumno PRIMARY KEY (CodigoA) 
) 
CREATE TABLE Curso 
( 
 CodigoC char(4) NOT NULL, 
 Descripcion varchar(30) NOT NULL, 
 FechaInicio smalldatetime NOT NULL, 
 Costo float NOT NULL DEFAULT 120, 
 
 CONSTRAINT PK_Curso PRIMARY KEY (CodigoC) 
) 
CREATE TABLE Matricula 
( 
 CodigoA char(6) NOT NULL, 
 CodigoC char(4) NOT NULL, 
 FechaMat smalldatetime NOT NULL, 
 TipoPago char(1) NOT NULL DEFAULT 'C', 
 
 CONSTRAINT PK_Matricula PRIMARY KEY(CodigoA, CodigoC), 
 CONSTRAINT FK_Matricula_Alumno 
FOREIGN KEY (CodigoA) REFERENCES Alumno(CodigoA), 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 14
 CONSTRAINT FK_Matricula_Curso 
FOREIGN KEY (CodigoC) REFERENCES Curso(CodigoC) 
) 
 
 
 
 
Ejemplo 3 
Un empleado puede ser jefe de otros empleados y cada empleado tiene un solo jefe. 
 
 
CREATE TABLE Empleado 
( 
 Nss char(9) NOT NULL, 
 NombreP varchar(15) NOT NULL, 
 Apellidos varchar(15) NOT NULL, 
 Direccion varchar(30) NOT NULL, 
 NssSuper char(9) NULL, 
 
 CONSTRAINT PK_empleado PRIMARY KEY(Nss), 
 CONSTRAINT FK_empleado_empleado 
FOREIGN KEY(NssSuper) REFERENCES Empleado(Nss), 
) 
 
 
 
Puede crearse una restricción FOREIGN KEY utilizando más de una columna. Debe conservarse la compatibilidad en 
tipo y longitud de las columnas a relacionarse. 
 
 
Investigar 
 
 CREAR RELACIONES RECURSIVAS 
 CREAR RELACIONES OPCIONALES 
 ACCIONES DE INTEGRIDAD REFERENCIAL 
 Vistas INFORMATION_SCHEMA 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com 
 15
 
Responder a las siguientes preguntas: 
 
 ¿Cuál es el orden en que se efectúan las comprobaciones de integridad? 
 ¿Es recomendable crear una restricción PRIMARY KEY sobre columnas de tipo FLOAT? ¿Por qué? 
s? ¿Los tipos de datos de las columnas relacionadas de dos tablas deben ser siempre iguale
 ¿Cómo se almacenan los valores para columnas de tipo DATETIME y SMALLDATETIME? 
 ¿Cuándo es conveniente utilizar tipos de datos de longitud variable en lugar de longitud fija? 
s? 
 ¿Cómo puedo agregar una nueva restricción a una tabla sin comprobación de los datos ya existentes? 
 ¿Es posible deshabilitar una restricción existente? ¿Cómo? 
 
 
Escuela Profesional de Computación e Informática 
 Jorge Martín Rodríguez Castro 
 
elaney, Kalen “A fondo Microsoft SQL Server 2000” 
icrosoft “MOC 2073A. Programming a Microsoft SQL Server 2000 Database” 
icrosoft “Implementing a Database on Microsoft SQL Server 7.0” 
 
Libros en Pantalla de SQL Server 2000. Edición Personal. 
 
 ¿Pueden utilizarse comillas como delimitadores de identificadores? ¿Cómo? 
 ¿Cuál es la utilidad del comando SET DATEFORMAT? 
cciones definidas tablas de una base de dato ¿Qué tablas de sistema almacenan información de las restri
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Universidad Nacional Pedro Ruiz Gallo 
Ing. MCSD.NET
 
Bibliografía: 
D
McGraw-Hill. 1era edición. España 2001. 904 pp. 
 
M
Microsoft. EEUU 2000. 460 pp. 
 
M
Microsoft. EEUU 1999. 594 pp. 
Ing. MCSD.NET Jorge Martín Rodríguez Castro. jorgerodcas@hotmail.com

Continuar navegando

Contenido elegido para ti

206 pag.
Base de Datos Avanzado I

Universidade de Vassouras

User badge image

GALLEGOS SEVILLA MARIA GUADALUPE

39 pag.
Lenguaje SQL _DDL y DML_

User badge image

Materiales Generales

34 pag.