Descarga la aplicación para disfrutar aún más
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
Compartir