Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta Fuente: http://es.wikipedia.org/wiki/Integridad_de_datos Integridad de datos El término integridad de datos se refiere a la corrección y completitud de los datos en una base de datos. Cuando los contenidos se modifican con sentencias INSERT, DELETE o UPDATE, la integridad de los datos almacenados puede perderse de muchas maneras diferentes. Pueden añadirse datos no válidos a la base de datos, tales como un pedido que especifica un producto no existente. Pueden modificarse datos existentes tomando un valor incorrecto, como por ejemplo si se reasigna un vendedor a una oficina no existente. Los cambios en la base de datos pueden perderse debido a un error del sistema o a un fallo en el suministro de energía. Los cambios pueden ser aplicados parcialmente, como por ejemplo si se añade un pedido de un producto sin ajustar la cantidad disponible para vender. Una de las funciones importantes de un DBMS relacional es preservar la integridad de sus datos almacenados en la mayor medida posible. Tipos de restricciones de integridad [editar] • Datos Requeridos: establece que una columna tenga un valor no NULL. Se define efectuando la declaración de una columna es NOT NULL cuando la tabla que contiene las columnas se crea por primera vez, como parte de la sentencia CREATE TABLE. • Chequeo de Validez: cuando se crea una tabla cada columna tiene un tipo de datos y el DBMS asegura que solamente los datos del tipo especificado sean ingresados en la tabla. • Integridad de entidad: establece que la clave primaria de una tabla debe tener un valor único para cada fila de la tabla; si no, la base de datos perderá su integridad. Se especifica en la sentencia CREATE TABLE. El DBMS comprueba automáticamente la unicidad del valor de la clave primaria con cada sentencia INSERT Y UPDATE. Un intento de insertar o actualizar una fila con un valor de la clave primaria ya existente fallará. • Integridad referencial: asegura la integridad entre las claves ajenas y primarias (relaciones padre/hijo). Existen cuatro actualizaciones de la base de datos que pueden corromper la integridad referencial: • La inserción de una fila hijo se produce cuando no coincide la clave ajena con la clave primaria del padre. • La actualización en la clave ajena de la fila hijo, donde se produce una actualización en la clave ajena de la fila hijo con una sentencia UPDATE y la misma no coincide con ninguna clave primaria. • La supresión de una fila padre, con la que, si una fila padre -que tiene uno o más hijos- se suprime, las filas hijos quedarán huérfanas. 1/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta Fuente: http://www.aulaclic.es/sql/b_8_1_1.htm Conceptos básicos de integridad referencial. Introducción La integridad referencial es un sistema de reglas que utilizan la mayoría de las bases de datos relacionales para asegurarse que los registros de tablas relacionadas son válidos y que no se borren o cambien datos relacionados de forma accidental produciendo errores de integridad. Primero repasemos un poco los tipos de relaciones. Tipos de relaciones. Entre dos tablas de cualquier base de datos relacional pueden haber dos tipos de relaciones, relaciones uno a uno y relaciones uno a muchos: Relación Uno a Uno: Cuando un registro de una tabla sólo puede estar relacionado con un único registro de la otra tabla y viceversa. Por ejemplo: tenemos dos tablas una de profesores y otra de departamentos y queremos saber qué profesor es jefe de qué departamento, tenemos una relación uno a uno entre las dos tablas ya que un departamento tiene un solo jefe y un profesor puede ser jefe de un solo departamento. Relación Uno a Varios: Cuando un registro de una tabla (tabla secundaria) sólo puede estar relacionado con un único registro de la otra tabla (tabla principal) y un registro de la tabla principal puede tener más de un registro relacionado en la tabla secundaria, en este caso se suele hacer referencia a la tabla principal como tabla 'padre' y a la tabla secundaria como tabla 'hijo', entonces la regla se convierte en 'un padre puede tener varios hijos pero un hijo solo tiene un padre (regla más fácil de recordar). Por ejemplo: tenemos dos tablas una con los datos de diferentes poblaciones y otra con los habitantes, una población puede tener más de un habitante, pero un habitante pertenecerá (estará empadronado) en una única población. En este caso la tabla principal será la de poblaciones y la tabla secundaria será la de habitantes. Una población puede tener varios habitantes pero un habitante pertenece a una sola población. Esta relación se representa incluyendo en la tabla 'hijo' 2/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta una columna que se corresponde con la clave principal de la tabla 'padre', esta columna es lo denominamos clave foránea (o clave ajena o clave externa). Una clave foránea es pues un campo de una tabla que contiene una referencia a un registro de otra tabla. Siguiendo nuestro ejemplo en la tabla habitantes tenemos una columna población que contiene el código de la población en la que está empadronado el habitante, esta columna es clave ajena de la tabla habitantes, y en la tabla poblaciones tenemos una columna codigo de poblacion clave principal de la tabla. Relación Varios a Varios: Cuando un registro de una tabla puede estar relacionado con más de un registro de la otra tabla y viceversa. En este caso las dos tablas no pueden estar relacionadas directamente, se tiene que añadir una tabla entre las dos que incluya los pares de valores relacionados entre sí. Por ejemplo: tenemos dos tablas una con los datos de clientes y otra con los artículos que se venden en la empresa, un cliente podrá realizar un pedido con varios artículos, y un artículo podrá ser vendido a más de un cliente. No se puede definir entre clientes y artículos, hace falta otra tabla (por ejemplo una tabla de pedidos) relacionada con clientes y con artículos. La tabla pedidos estará relacionada con cliente por una relación uno a muchos y también estará relacionada con artículos por un relación uno a muchos. 3/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta Integridad referencial Cuando se define una columna como clave foránea, las filas de la tabla pueden contener en esa columna o bien el valor nulo (ningún valor), o bien un valor que existe en la otra tabla, un error sería asignar a un habitante una población que no está en la tabla de poblaciones. Eso es lo que se denomina integridad referencial y consiste en que los datos que referencian otros (claves foráneas) deben ser correctos. La integridad referencial hace que el sistema gestor de la base de datos se asegure de que no hayan en las claves foráneas valores que no estén en la tabla principal. La integridad referencial se activa en cuanto creamos una clave foránea y a partir de ese momento se comprueba cada vez que se modifiquen datos que puedan alterarla. ¿ Cuándo se pueden producir errores en los datos? Cuando insertamos una nueva fila en la tabla secundaria y el valor de la clave foránea no existe en la tabla principal. insertamos un nuevo habitante y en la columna poblacion escribimos un código de poblacion que no está en la tabla de poblaciones (una población que no existe). Cuando modificamos el valor de la clave principal de un registro que tiene 'hijos', modificamos el codigo de Valencia, sustituimos el valor que tenía (1) por un nuevo valor (10), si Valencia tenía habitantes asignados, qué pasa con esos habitantes, no pueden seguir teniendo el codigo de población 1 porque la población 1 ya no existe, en este caso hay dos alternativas, no dejar cambiar el codigo de Valencia o bien cambiar el codigo de población de todos los habitantes de Valencia y asignarles el código 10. Cuando modificamos el valor de la clave foránea, el nuevo valor debe existir en la tabla principal. Por ejemplo cambiamos la población de un habitante, tenía asignada la población 1 (porque estaba empadronado en valencia) y ahora se le asigna la población 2 porque cambia de lugar de residencia. La población 2 debe existir en la tabla de poblaciones. Cuando queremos borrar una fila de la tabla principal y ese registro tiene 'hijos', por ejemplo queremos borrar la población 1 (Valencia) si existen habitantes asignados a la población 1, estos no se pueden quedar con el valor 1 en la columna población porque tendrían asignada una población que no existe. En este caso tenemos dos alternativas, no dejar borrar la población 1 de la 4/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta tabla de poblaciones, o bien borrarla y poner a valor nulo el campo poblacion de todos sus 'hijos'. Asociada a la integridad referencial están los conceptos de actualizar los registros en cascada y eliminar registros en cascada. Actualización y borrado en cascada El actualizar y/o eliminar registros en cascada, son opciones que se definen cuando definimos la clave foránea y que le indican al sistema gestor qué hacer en los casos comentados en el punto anterior. Actualizar registros en cascada: Esta opción le indica al sistema gestor de la base de datos que cuando se cambie un valor del campo clave de la tabla principal, automáticamente cambiará el valor de la clave foránea de los registros relacionados en la tabla secundaria. Por ejemplo, si cambiamos en la tabla de poblaciones (la tabla principal) el valor 1 por el valor 10 en el campo codigo (la clave principal), automáticamente se actualizan todos los habitantes (en la tabla secundaria) que tienen el valor 1 en el campo poblacion (en la clave ajena) dejando 10 en vez de 1. Si no se tiene definida esta opción, no se puede cambiar los valores de la clave principal de la tabla principal. En este caso, si intentamos cambiar el valor 1 del codigo de la tabla de poblaciones , no se produce el cambio y el sistema nos devuelve un error o un mensaje que los registros no se han podido modificar por infracciones de clave. Eliminar registros en cascada: Esta opción le indica al sistema gestor de la base de datos que cuando se elimina un registro de la tabla principal automáticamente se borran también los registros relacionados en la tabla secundaria. Por ejemplo: Si borramos la población Onteniente en la tabla de poblaciones, automáticamente todos los habitantes de Onteniente se borrarán de la tabla de habitantes. Si no se tiene definida esta opción, no se pueden borrar registros de la tabla principal si estos tienen registros relacionados en la tabla secundaria. En este caso, si intentamos borrar la población Onteniente, no se produce el borrado y el sistema nos devuelve un error o un mensaje que los 5/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta registros no se han podido eliminar por infracciones de clave. Fuente: http://msdn.microsoft.com/es-es Integridad de los datos La exigencia de integridad de los datos garantiza la calidad de los datos de la base de datos. Por ejemplo, si se especifica para un empleado el valor de identificador de 123, la base de datos no debe permitir que ningún otro empleado tenga el mismo valor de identificador. Si tiene una columna employee_rating para la que se prevean valores entre 1 y 5, la base de datos no debe aceptar valores fuera de ese intervalo. Si en la tabla hay una columna dept_id en la que se almacena el número de departamento del empleado, la base de datos sólo debe permitir valores que correspondan a los números de departamento de la empresa. Dos pasos importantes en el diseño de las tablas son la identificación de valores válidos para una columna y la determinación de cómo forzar la integridad de los datos en la columna. La integridad de datos pertenece a una de las siguientes categorías: • • • • Integridad de entidad Integridad de dominio Integridad referencial Integridad definida por el usuario Integridad de entidad La integridad de entidad define una fila como entidad única para una tabla determinada. La 6/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta integridad de entidad exige la integridad de las columnas de los identificadores o la clave principal de una tabla, mediante índices y restricciones UNIQUE, o restricciones PRIMARY KEY. Integridad de dominio La integridad de dominio viene dada por la validez de las entradas para una columna determinada. Puede exigir la integridad de dominio para restringir el tipo mediante tipos de datos, el formato mediante reglas y restricciones CHECK, o el intervalo de valores posibles mediante restricciones FOREIGN KEY, restricciones CHECK, definiciones DEFAULT, definiciones NOT NULL y reglas. Integridad referencial La integridad referencial protege las relaciones definidas entre las tablas cuando se crean o se eliminan filas. En SQL Server la integridad referencial se basa en las relaciones entre claves externas y claves principales o entre claves externas y claves exclusivas, mediante restricciones FOREIGN KEY y CHECK.La integridad referencial garantiza que los valores de clave sean coherentes en las distintas tablas. Para conseguir esa coherencia, es preciso que no haya referencias a valores inexistentes y que, si cambia el valor de una clave, todas las referencias a ella se cambien en consecuencia en toda la base de datos. Cuando se exige la integridad referencial, SQL Server impide a los usuarios: • Agregar o cambiar filas en una tabla relacionada si no hay ninguna fila asociada en la tabla principal. • Cambiar valores en una tabla principal que crea filas huérfanas en una tabla relacionada. • Eliminar filas de una tabla principal cuando hay filas relacionadas coincidentes. Por ejemplo, en las tablas Sales.SalesOrderDetail y Production.Product de la base de datos AdventureWorks, la integridad referencial se basa en la relación entre la clave externa (ProductID) de la tabla Sales.SalesOrderDetail y la clave principal (ProductID) de la tabla Production.Product. Esta relación garantiza que un pedido de ventas no pueda nunca hacer referencia a un producto que no existe en la tabla Production.Product. 7/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta Integridad definida por el usuario La integridad definida por el usuario permite definir reglas de empresa específicas que no pertenecen a ninguna otra categoría de integridad. Todas las categorías de integridad admiten la integridad definida por el usuario. Esto incluye todas las restricciones de nivel de columna y nivel de tabla en CREATE TABLE, procedimientos almacenados y desencadenadores. Exigir la integridad de datos Planear y crear tablas requiere identificar los valores válidos para las columnas y decidir cómo exigir la integridad de los datos en las columnas. SQL Server proporciona los siguientes mecanismos para exigir la integridad de los datos en una columna: • Restricciones PRIMARY KEY Una tabla suele tener una columna o una combinación de columnas cuyos valores identifican de forma única cada fila de la tabla. Estas columnas se denominan claves principales de la tabla y exigen la integridad de entidad de la tabla. Puede crear una clave principal mediante la definición de una restricción PRIMARY KEY cuando cree o modifique una tabla. Una tabla sólo puede tener una restricción PRIMARY KEY y ninguna columna a la que se aplique una restricción PRIMARY KEY puede aceptar valores NULL. Debido a que las restricciones PRIMARY KEY garantizan datos únicos, con frecuencia se definen en una columna de identidad. Cuando especifica una restricción PRIMARY KEY en una tabla, Database Engine (Motor de base de datos) exige la unicidad de los datos mediante la creación de un índice único para las columnas de clave principal.Este índice también permite un acceso rápido a los datos cuando se utiliza la clave principal en las consultas. De esta forma, las claves principales que se eligen deben seguir las reglas para crear índices únicos. Si se define una restricción PRIMARY KEY para más de una columna, puede haber valores 8/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta duplicados dentro de la misma columna, pero cada combinación de valores de todas las columnas de la definición de la restricción PRIMARY KEY debe ser única. Como se muestra en la siguiente ilustración, las columnas ProductID y VendorID de la tabla Purchasing.ProductVendor forman una restricción PRIMARY KEY compuesta para esta tabla. Así se garantiza que la combinación de ProductID y VendorID es única. Cuando trabaja con combinaciones, las restricciones PRIMARY KEY relacionan una tabla con otra. Por ejemplo, para determinar los proveedores que suministran determinados productos, puede utilizar una combinación de tres elementos entre las tablas Purchasing.Vendor, Production.Product y Purchasing.ProductVendor. Puesto que ProductVendor contiene las columnas de ProductID y VendorID, se puede obtener acceso a las tablas Product y Vendor mediante su relación con ProductVendor. • Restricciones FOREIGN KEY Una clave externa (FK) es una columna o combinación de columnas que se utiliza para establecer y exigir un vínculo entre los datos de dos tablas. Puede crear una clave externa mediante la definición de una restricción FOREIGN KEY cuando cree o modifique una tabla. En una referencia de clave externa, se crea un vínculo entre dos tablas cuando las columnas de una de ellas hacen referencia a las columnas de la otra que contienen el valor de clave principal. Esta columna se convierte en una clave externa para la segunda tabla. Por ejemplo, la tabla Sales.SalesOrderHeader de la base de datos AdventureWorks2008R2 tiene un vínculo a la tabla Sales.SalesPerson porque existe una relación lógica entre pedidos de ventas y personal de ventas. La columna SalesPersonID de la tabla SalesOrderHeader coincide con la columna de clave principal de la tabla SalesPerson. La columna SalesPersonID de la tabla SalesOrderHeader es la clave externa para la tabla SalesPerson. 9/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta No es necesario que una restricción FOREIGN KEY esté vinculada únicamente a una restricción PRIMARY KEY de otra tabla; también puede definirse para que haga referencia a las columnas de una restricción UNIQUE de otra tabla. Una restricción FOREIGN KEY puede contener valores NULL, pero si alguna columna de una restricción FOREIGN KEY compuesta contiene valores NULL, se omitirá la comprobación de los valores que componen la restricción FOREIGN KEY. Para asegurarse de que todos los valores de la restricción FOREIGN KEY compuesta se comprueben, especifique NOT NULL en todas las columnas que participan. Nota: 10/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta Una restricción FOREIGN KEY puede hacer referencia a columnas de tablas de la misma base de datos o a columnas de una misma tabla. Se denominan tablas con referencia a sí mismas. Suponga, por ejemplo, una tabla de empleados con tres columnas: employee_number, employee_name y manager_employee_number. Dado que el responsable también es un empleado, hay una relación de clave externa desde la columna manager_employee_number a la columna employee_number. Integridad referencial Aunque el fin principal de una restricción FOREIGN KEY es controlar los datos que pueden almacenarse en la tabla de la clave externa; también controla los cambios realizados en los datos de la tabla de la clave principal. Por ejemplo, si se elimina la fila de un vendedor de la tabla Sales.SalesPerson y el identificador del vendedor se utiliza para pedidos de ventas en la tabla Sales.SalesOrderHeader, se rompe la integridad relacional entre ambas tablas: los pedidos del vendedor eliminado quedarán sin correspondencia en la tabla SalesOrderHeader sin ningún vínculo con los datos de la tabla SalesPerson. Con una restricción FOREIGN KEY se evita esta situación. Esta restricción exige la integridad referencial al garantizar que no se puedan realizar cambios en los datos de la tabla de la clave principal si esos cambios anulan el vínculo con los datos de la tabla de la clave externa. Si se intenta eliminar la fila de una tabla de la clave principal o cambiar un valor de clave principal, la acción no progresará si el valor de la clave principal cambiado o eliminado corresponde a un valor de la restricción FOREIGN KEY de otra tabla. Para cambiar o eliminar una fila de una restricción FOREIGN KEY, debe antes eliminar o cambiar los datos de clave externa de la tabla de clave externa, lo que vincula la clave externa con otros datos de clave principal. Indizar restricciones FOREIGN KEY La creación de un índice en una clave externa suele ser útil por las siguientes razones: • Los cambios en las restricciones PRIMARY KEY se comprueban con restricciones FOREIGN KEY en las tablas relacionadas. • Las columnas de clave externa suelen utilizarse en los criterios de combinación cuando los datos de las tablas relacionadas se combinan en consultas mediante la correspondencia de la columna o columnas de la restricción FOREIGN KEY de una tabla y la columna o columnas de la clave única o principal de la otra. Un índice permite al Database Engine (Motor de base de datos) buscar con rapidez datos relacionados en la tabla de clave externa.No obstante, no es necesario crear este índice. Pueden combinarse los datos de dos tablas relacionadas aunque no se hayan definido restricciones PRIMARY KEY o FOREIGN KEY entre ellas, pero una relación de clave externa entre dos tablas indica que éstas se han optimizado para su combinación en una consulta que utilice las claves como criterio. Para obtener más información acerca de cómo usar restricciones FOREIGN KEY con combinaciones, vea Aspectos básicos de las combinaciones y Tipos de consultas e índices. 11/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta Número de restricciones FOREIGN KEY en una tabla SQL Server no establece un límite predefinido en el número de restricciones FOREIGN KEY que una tabla puede incluir (que hagan referencia a otras tablas) ni el número de restricciones FOREIGN KEY pertenecientes a otras tablas que hagan referencia a determinada tabla. No obstante, el número real de restricciones FOREIGN KEY se ve limitado por la configuración de hardware y el diseño de la base de datos y la aplicación. Se recomienda que una tabla no contenga más de 253 restricciones FOREIGN KEY y que no sea referencia para más de 253 restricciones FOREIGN KEY. Tenga en cuenta el costo de exigir restricciones FOREIGN KEY cuando diseñe la base de datos y las aplicaciones. • Restricciones UNIQUE Puede utilizar restricciones UNIQUE para garantizar que no se escriben valores duplicados en columnas específicas que no forman parte de una clave principal. Tanto la restricción UNIQUE como la restricción PRIMARY KEY exigen la unicidad; sin embargo, debe utilizar la restricción UNIQUE y no PRIMARY KEY si desea exigir la unicidad de una columna o una combinación de columnas que no forman la clave principal. En una tabla se pueden definir varias restricciones UNIQUE, pero sólo una restricción PRIMARY KEY. Además, a diferencia de las restricciones PRIMARY KEY, las restricciones UNIQUE admiten valores NULL. Sin embargo, de la misma forma que cualquier valor incluido en una restricción UNIQUE, sólo se admite un valor NULL por columna. Es posible hacer referencia a una restricción UNIQUE con una restricción FOREIGN KEY. • Restricciones CHECK Las restricciones CHECK exigen la integridad del dominio mediante la limitación de los valores que puede aceptar una columna. Son similares a las restricciones FOREIGN KEY porque controlan los valores que se colocan en una columna. La diferencia reside en la forma en que determinan qué valores son válidos: las restricciones FOREIGN KEY obtienen la lista de valores válidos de otra tabla, mientras que las restricciones CHECK determinan los valores válidos a partir de una expresión lógica que no se basa en datos de otra columna. Por ejemplo, es posible limitar el intervalo de valores para una columna salary creando una restricción CHECK que sólo permita datos entre 15.000 y 100.000 dólares. De este modo se impide que se escriban salarios superiores al intervalo de salario normal. Puede crear una restricción CHECK con cualquier expresión lógica (booleana) que devuelva TRUE (verdadero) o FALSE (falso) basándose en operadores lógicos. Para el ejemplo anterior, la expresión lógica sería: Puede aplicar varias restricciones CHECK a una sola columna. También puede aplicar una sola restricción CHECK a varias columnas si se crea en el nivel de la tabla. Por ejemplo, una restricción 12/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta CHECK para varias columnas se puede utilizar para confirmar que cualquier fila con un valor USA en la columna country/region tiene también un valor de dos caracteres en la columna state. Así se pueden comprobar varias condiciones en un mismo sitio. Limitaciones de las restricciones CHECK Las restricciones CHECK rechazan los valores que se evalúan como FALSE. Puesto que los valores nulos se evalúan como UNKNOWN, su presencia en las expresiones puede reemplazar una restricción. Por ejemplo, supongamos que coloca una restricción en una columna intMyColumn que especifica que MyColumn sólo puede contener el valor 10 (MyColumn=10). Si inserta el valor NULL en MyColumn, Database Engine (Motor de base de datos) inserta NULL y no devuelve un error. Una restricción CHECK devuelve TRUE cuando la condición que está comprobando no es FALSE para ninguna fila de la tabla. Si una tabla recién creada no tiene filas, cualquier restricción CHECK en esta tabla se considerará válida. Esta situación puede generar resultados inesperados, como en el siguiente ejemplo. CREATE TABLE CheckTbl (col1 int, col2 int); GO CREATE FUNCTION CheckFnctn() RETURNS int AS BEGIN DECLARE @retval int SELECT @retval = COUNT(*) FROM CheckTbl RETURN @retval END; GO ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1 ); GO La restricción CHECK que se agrega especifica que como mínimo debe existir una fila en la tabla CheckTbl. Sin embargo, puesto que no hay filas en la tabla contra la que se comprueba la condición de esta restricción, la instrucción ALTER TABLE será correcta. Las restricciones CHECK no se validan durante las instrucciones DELETE. Por lo tanto, la ejecución de instrucciones DELETE en las tablas con ciertos tipos de restricciones CHECK puede generar resultados inesperados. Por ejemplo, imaginemos que las siguientes instrucciones se ejecutan en la tabla CheckTbl. INSERT INTO CheckTbl VALUES (10, 10) GO DELETE CheckTbl WHERE col1 = 10; 13/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt Departamento de Informática Cátedra de Base de Datos I Facultad Politécnica Sección NA Universidad Nacional de Asunción Docente: José Rojas Dávalos Unidad 3: Diseño de bases de datos relacionales 3.3. Integridad de bases de datos Documentos de consulta La instrucción DELETE será correcta aunque la restricción CHECK especifique que la tabla CheckTbl debe tener al menos 1 fila. • Definiciones DEFAULT Cada columna de un registro debe contener un valor, aunque sea un valor NULL. Puede haber situaciones en las que deba cargar una fila de datos en una tabla, pero no conozca el valor de una columna o el valor ya no exista. Si la columna acepta valores NULL, puede cargar la fila con un valor NULL. Pero, dado que puede no resultar conveniente utilizar columnas que acepten valores NULL, una mejor solución podría ser establecer una definición DEFAULT para la columna siempre que sea necesario. Por ejemplo, es habitual especificar el valor cero como valor predeterminado para las columnas numéricas, o N/D (no disponible) como valor predeterminado para las columnas de cadenas cuando no se especifica ningún valor. Al cargar una fila en una tabla con una definición DEFAULT para una columna, se indica implícitamente a Database Engine (Motor de base de datos) que cargue un valor predeterminado en la columna en la que no se haya especificado ningún valor. • Permitir valores NULL La nulabilidad de una columna determina si las filas de una tabla pueden contener un valor NULL en esa columna. Un valor NULL no es lo mismo que cero (0), en blanco o que una cadena de caracteres de longitud cero, como "". NULL significa que no hay ninguna entrada. La presencia de un valor NULL suele implicar que el valor es desconocido o no está definido. Por ejemplo, un valor NULL en la columna SellEndDate de la tabla Production.Product de la base de datos AdventureWorks2008R2 no implica que el artículo no tenga una fecha de venta final. El valor NULL significa que se desconoce la fecha o que no se ha establecido. Si se inserta una fila, pero no se incluye ningún valor para una columna que permita valores NULL, Database Engine (Motor de base de datos) proporcionará el valor NULL, a menos que exista una definición o un objeto DEFAULT. Una columna definida con la palabra clave NULL también acepta una entrada explícita de NULL por parte del usuario, independientemente del tipo de datos de que se trate o de si tiene un valor predeterminado asociado. El valor NULL no debe ponerse entre comillas porque no será interpretado como un valor NULL, sino como la cadena de caracteres "NULL". Si se configura una columna para que no permita valores NULL, será más fácil mantener la integridad de los datos, ya que se garantiza que una columna de una fila siempre contendrá datos. Si no se aceptan valores NULL, el usuario que escriba los datos en la tabla deberá especificar un valor para la columna; de lo contrario, no se podrá aceptar la fila de la tabla en la base de datos. Fin del documento 14/14 25/05/10 04:15:19 /media/JROJASD/fpuna/20122/bd1na/unidad3/documentosdeconsulta/d03-03.odt