viernes, 25 de marzo de 2016

Receta T-SQL No. 3-7: Forzar la Integridad Referencial sobre Columnas que Admiten Valores NULL

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Integridad referencial
5.2 Definición de una llave foránea con valores NULL
6. Práctica: Definición de Tablas con Integridad Referencial
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

En esta séptima receta T-SQL -de la serie Valores NULL-, se demuestra cómo permitir la agregación de valores NULL sobre columnas de llave foránea. Se muestra cómo a través de código T-SQL se puede alterar la definición de una tabla para permitir valores NULL. Este caso se puede dar en tablas con llave foránea que no requieran la inserción de un valor distinto a NULL en un determinado momento.

2. Palabras Clave

  • Columna
  • Integridad referencial
  • Llave foránea
  • Llave primaria
  • NULL

3. Problema

Definir una tabla con llave foránea que admita valores NULL.

4. Solución

Es posible definir una llave foránea que admita valores NULL en la definición de tablas que requieren integridad referencial.

5. Discusión de la Solución

5.1 Integridad referencial

La integridad referencial es una propiedad elemental y deseable en la creación de una base de datos. Esta propiedad provee a los datos validez, consistencia, correctitud, no-duplicidad ("Integridad referencial", 2016).

En la Figura 1 se muestra el modelo físico de una base de datos qué está integrada por dos tablas: Usuarios y Ordenes. Para este caso se tiene una relación de uno a muchos: un usuario tiene uno o más órdenes. La integridad referencial en este ejemplo permite la creación de registros en la tabla Ordenes especificando un ID de usuario existente en la tabla Usuarios.
Relaciones Usuarios y Órdenes
Figura 1. Relaciones Usuarios y Ordenes.

5.2 Definición de una llave foránea con valores NULL

En T-SQL la definición de una llave foránea sigue, en esencia, esta sintaxis:

ALTER TABLE Nombre_Tabla ADD CONSTRAINT Nombre_Llave_Foranea FOREIGN KEY (Columna_Local) REFERENCES Nombre_Tabla_Foranea (Columna_Foranea)

6. Práctica: Definición de Tablas con Integridad Referencial

En esta sección práctica se demuestra cómo crear dos tablas:
  • Categoria
  • Item
Luego se insertan datos sobre la tabla Categoria. Se modifica la tabla Item para crear la llave foránea que admite valores NULL. Finalmente se intenta insertar valores sobre la tabla Item y comprobar el funcionamiento de la integridad referencial.

Creación de tablas:

CREATE TABLE Categoria(
IdCategoria INT NOT NULL
CONSTRAINT PK_Categoria PRIMARY KEY CLUSTERED,
NombreCategoria NVARCHAR(50) NOT NULL
)

INSERT INTO Categoria (IdCategoria, NombreCategoria)
VALUES (1, 'Categoría 1'),
(2, 'Categoría 2'),
(3, 'Categoría 3'),

CREATE TABLE Item(
IdItem INT NOT NULL
CONSTRAINT PK_Item PRIMARY KEY CLUSTERED,
NombreItem NVARCHAR(50) NOT NULL,
IdCategoria INT NULL
);

Modificación de la tabla Item para la agregación de llave foránea: 

ALTER TABLE Item ADD CONSTRAINT FK_Item_Categoria FOREIGN KEY (IdCategoria)
REFERENCES Categoria(IdCategoria);

Intento de inserción de datos sobre la tabla Item

INSERT INTO Item (IdItem, NombreItem, IdCategoria)
VALUES (1, 'Ítem 1', 1);

INSERT INTO Item (IdItem, NombreItem, IdCategoria)
    VALUES (2, 'Ítem 2', 4);

INSERT INTO Item (IdItem, NombreItem, IdCategoria)
VALUES (3, 'Ítem 3', NULL);

Al ejecutar este código en un script de Microsoft SQL Server Management Studio se obtiene el siguiente mensaje:

(1 row(s) affected)
Msg 547, Level 16, State 0, Line 26
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Item_Categoria". The conflict occurred in database "Recetas", table "dbo.Categoria", column 'IdCategoria'.
The statement has been terminated.

(1 row(s) affected)

El segundo mensaje de error corresponde con el intento de referenciar un llave foránea que no existe: con el valor número 4.

Hay que notar aquí que la primera sentencia es correcto; lo mismo ocurre con la tercera: la inserción de un valor NULL sobre el campo de llave foránea no viola la integridad referencial.

7. Conclusiones

Se demostró cómo forzar la integridad referencial para permitir valores NULL en llaves foráneas. Se comprendió que a pesar de la admisión de valores NULL sobre una llave foránea, la inserción de valores distintos a NULL que no existan en la tabla de llave primaria, no está permitida.

En la siguiente receta T-SQL se ilustra el proceso de unión de dos tablas con columnas que admiten valores NULL.

8. Literatura & Enlaces

Brimhall, J., Dye, D., Gennick, J., Roberts, A., Sheffield, W. (2012). SQL Server 2012 T-SQL Recipes - A Problem-Solucion Approach. United States: Apress.
Integridad referencial (2016, marzo 24). Recuperado desde: https://es.wikipedia.org/wiki/Integridad_referencial


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.