SQL

Cómo usar la restricción CHECK de SQL Server para cumplir una condición booleana

Estrada Web Group
jiestrada
Cómo usar la restricción CHECK de SQL Server para cumplir una condición booleana

Resumen: en este tutorial, aprenderás a usar la restricción CHECK de SQL Server para hacer cumplir una condición booleana.

Introducción a la restricción CHECK de SQL Server

La restricción CHECK permite especificar los valores en una columna que debe satisfacer una expresión booleana.

Por ejemplo, para requerir precios unitarios positivos, puedes usar el siguiente ejemplo de CREATE TABLE:

CREATE SCHEMA test;
GO
CREATE TABLE test.products(
    product_id INT IDENTITY PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    unit_price DEC(10,2) CHECK(unit_price > 0)
);

Como puedes ver, la definición de la restricción CHECK viene después del tipo de datos. Consiste en la palabra clave CHECK seguida de una expresión lógica entre paréntesis:

CHECK(unit_price > 0)

Al igual que la restricción UNIQUE, también puedes asignarle a la restricción CHECK un nombre utilizando la palabra clave CONSTRAINT de la siguiente manera:

CREATE TABLE test.products(
    product_id INT IDENTITY PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    unit_price DEC(10,2) CONSTRAINT positive_price CHECK(unit_price > 0)
);

Los nombres explícitos ayudan a clasificar los mensajes de error y te permiten hacer referencia a las restricciones cuando deseas modificarlas.

Si no especificas un nombre de restricción de esta manera, SQL Server genera automáticamente un nombre.

Observa la siguiente instrucción INSERT de SQL:
 

INSERT INTO test.products(product_name, unit_price)
VALUES ('Sistema Estrada Web Group', 0);

SQL Server regresa el siguiente error:

Instrucción INSERT en conflicto con la restricción CHECK 'positive_price'. El conflicto ha aparecido en la base de datos 'master', tabla 'test.products', column 'unit_price'.

El error se produjo porque el precio unitario no es mayor que cero como se especifica en la restricción CHECK.

La siguiente declaración funciona porque la expresión lógica definida en la restricción CHECK se evalúa como TRUE:

INSERT INTO test.products(product_name, unit_price)
VALUES ('Sistema Estrada Web Group', 599);

Restricción CHECK de SQL Server y NULL

Las restricciones CHECK rechazan los valores que hacen que la expresión booleana se evalúe como FALSE.

Debido a que NULL se evalúa como DESCONOCIDO, se puede usar en la expresión para omitir una restricción.

Por ejemplo, puedes insertar un producto cuyo precio unitario sea NULL como se muestra en la siguiente consulta:

INSERT INTO test.products(product_name, unit_price)
VALUES ('Sistema Estrada Web Group', NULL);

Aquí está el resultado:

(1 row affected)

SQL Server insertó NULL en la columna unit_price y no devolvió un error.

Para solucionar este problema, debes utilizar una restricción NOT NULL para la columna unit_price.

Restricción CHECK que hace referencia a varias columnas

Una restricción CHECK puede hacer referencia a varias columnas. Por ejemplo, almacena precios regulares y con descuento en la tabla test.products y si deseas asegurarte de que el precio con descuento sea siempre más bajo que el precio regular:

CREATE TABLE test.products(
    product_id INT IDENTITY PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    unit_price DEC(10,2) CHECK(unit_price > 0),
    discounted_price DEC(10,2) CHECK(discounted_price > 0),
    CHECK(discounted_price < unit_price)
);

Las dos primeras restricciones para unit_price y discounted_price deberían resultar familiares.

La tercera restricción usa una nueva sintaxis que no se adjunta a una columna en particular. En su lugar, aparece como un elemento de línea independiente en la lista de columnas separadas por comas.

Las dos primeras restricciones son de columna, mientras que la tercera es una restricción de tabla.

Debes tener en cuenta que puedes escribir restricciones de columna como restricciones de tabla. Sin embargo, no puedes escribir restricciones de tabla como restricciones de columna. Por ejemplo, puedes reescribir la declaración anterior de la siguiente manera:

CREATE TABLE test.products(
    product_id INT IDENTITY PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    unit_price DEC(10,2),
    discounted_price DEC(10,2),
    CHECK(unit_price > 0),
    CHECK(discounted_price > 0),
    CHECK(discounted_price > unit_price)
);

o incluso:

CREATE TABLE test.products(
    product_id INT IDENTITY PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    unit_price DEC(10,2),
    discounted_price DEC(10,2),
    CHECK(unit_price > 0),
    CHECK(discounted_price > 0 AND discounted_price > unit_price)
);

También puedes asignar un nombre a una restricción de tabla de la misma manera que a una restricción de columna:

CREATE TABLE test.products(
    product_id INT IDENTITY PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    unit_price DEC(10,2),
    discounted_price DEC(10,2),
    CHECK(unit_price > 0),
    CHECK(discounted_price > 0),
    CONSTRAINT valid_prices CHECK(discounted_price > unit_price)
);

Agregar restricciones CHECK a una tabla existente

Para agregar una restricción CHECK a una tabla existente, usa la instrucción ALTER TABLE ADD CONSTRAINT.

Por ejemplo, si tienes la siguiente tabla test.products:

CREATE TABLE test.products(
    product_id INT IDENTITY PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    unit_price DEC(10,2) NOT NULL
);

Para agregar una restricción CHECK a la tabla test.products, usa la siguiente declaración:

ALTER TABLE test.products
ADD CONSTRAINT positive_price CHECK(unit_price > 0);

Para agregar una nueva columna con una restricción CHECK, usa la siguiente declaración:

ALTER TABLE test.products
ADD discounted_price DEC(10,2)
CHECK(discounted_price > 0);

Para agregar una restricción CHECK llamada valid_price, usa la siguiente declaración:

ALTER TABLE test.products
ADD CONSTRAINT valid_price
CHECK(unit_price > discounted_price);

Eliminar restricciones CHECK

Para eliminar una restricción CHECK, utiliza la instrucción ALTER TABLE DROP CONSTRAINT:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

Si asignas a una restricción CHECK un nombre específico, puedes hacer referencia al nombre en la declaración.

Sin embargo, en caso de que no hayas asignado a la restricción CHECK un nombre en particular, debes buscarlo utilizando la siguiente declaración:

EXEC sp_help 'table_name';

Por ejemplo:

EXEC sp_help 'test.products';

Esta declaración emite mucha información, incluidos los nombres de las restricciones:

Check Constraint SQL Server

La siguiente declaración elimina la restricción de positive_price:

ALTER TABLE test.products
DROP CONSTRAINT positive_price;

Deshabilita las restricciones CHECK para insertar o actualizar

Para deshabilitar una restricción CHECK para insertar o actualizar datos, usa la siguiente declaración:

ALTER TABLE table_name
NOCHECK CONSTRAINT constraint_name;

La siguiente declaración deshabilita la restricción valid_price:

ALTER TABLE test.products
NO CHECK CONSTRAINT valid_price;

En este tutorial, has aprendido a utilizar la restricción CHECK de SQL Server para limitar los valores que se pueden insertar o actualizar en una o más columnas de una tabla.

Compartir artículo:

Más artículos geniales

Cómo eliminar columnas de una tabla en SQL Server con ALTER TABLE y DROP COLUMN

Cómo eliminar columnas de una tabla en SQL Server con ALTER TABLE y DROP COLUMN

Resumen: en este tutorial, aprenderás cómo usar la declaración de columna ALTER TABLE DROP COLUMN de SQL Server para eliminar una o más columnas de una tabla existente.

Ver artículo completo
Cómo filtrar por un rango de fechas en SQL Server con el operador BETWEEN

Cómo filtrar por un rango de fechas en SQL Server con el operador BETWEEN

La sentencia u operador BETWEEN de SQL le permite probar fácilmente si una expresión está dentro de un rango de valores. Los valores pueden ser texto, fechas o números.

Ver artículo completo
¿Cómo crear una tabla en SQL Server?

¿Cómo crear una tabla en SQL Server?

En este tutorial, aprenderá a usar la instrucción CREATE TABLE de SQL Server para crear una nueva tabla.

Ver artículo completo

Manténgase actualizado

Obtenga excelente contenido en su bandeja de entrada todas las semanas.
Solo contenido excelente, no compartimos su correo electrónico con terceros.
Subir al inicio de la pantalla ;