Appearance
¿Qué es un DOMAIN en PostgreSQL?
Un DOMAIN es un tipo de dato personalizado que se construye a partir de un tipo existente, como VARCHAR, INTEGER o NUMERIC, al que se le pueden agregar restricciones para validar los valores permitidos.
Su principal ventaja es la reutilización de reglas de validación. En lugar de repetir el mismo CHECK en múltiples tablas, puedes definirlo una sola vez y utilizarlo en todas las columnas que lo necesiten.
1. Crear un DOMAIN
La sintaxis general es:
sql
CREATE DOMAIN nombre_dominio AS tipo_dato
CHECK (condicion);Por ejemplo, podemos crear un dominio para validar nombres:
sql
CREATE DOMAIN nombre_valido AS VARCHAR(50)
CHECK (VALUE ~ '\S');En este caso:
CREATE DOMAIN nombre_valido: crea un dominio llamadonombre_valido.AS VARCHAR(50): establece el tipo de dato base y su longitud máxima.VALUE: representa el valor que se está validando.~: compara el texto con una expresión regular.'\S': exige al menos un carácter que no sea un espacio en blanco.
Este dominio rechaza cadenas vacías y cadenas compuestas únicamente por espacios, pero permite nombres como Llantas, Ancho o 205/55R16.
Importante: el dominio no impide automáticamente los valores NULL. Para eso, debes declarar NOT NULL en la columna o establecer la restricción correspondiente en el dominio.
2. Utilizar un DOMAIN en varias tablas
Una vez creado, puedes utilizarlo como cualquier otro tipo de dato:
sql
CREATE TABLE CATEGORIA (
id_categoria BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
nombre nombre_valido NOT NULL
);
CREATE TABLE PRODUCTO (
id_producto BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
nombre nombre_valido NOT NULL
);Ambas tablas reutilizan la misma regla de validación sin tener que declarar un CHECK por separado.
3. ¿Qué ocurre si se intenta insertar un valor inválido?
sql
INSERT INTO CATEGORIA (nombre)
VALUES (' ');La operación falla porque el valor no cumple la restricción del dominio.
En cambio:
sql
INSERT INTO CATEGORIA (nombre)
VALUES ('Llantas');La operación se permite porque el valor cumple la regla.
4. Modificar un DOMAIN
Puedes agregar restricciones adicionales mediante ALTER DOMAIN.
Por ejemplo, para impedir los valores NULL en el dominio:
sql
ALTER DOMAIN nombre_valido
SET NOT NULL;Ten en cuenta que esto afecta a todas las columnas que utilizan ese dominio y que los datos existentes deben cumplir la nueva restricción.
También puedes eliminar una restricción por su nombre:
sql
ALTER DOMAIN nombre_valido
DROP CONSTRAINT nombre_restriccion;Para administrar restricciones con facilidad, es recomendable asignarles nombres explícitos al crearlas.
5. DOMAIN frente a CHECK
| Característica | DOMAIN | CHECK en una tabla |
|---|---|---|
| Reutilizar validaciones | Sí, entre columnas y tablas | No directamente |
| Validar un valor individual | Sí | Sí |
| Validar relaciones entre columnas | No es su propósito | Sí |
| Definir reglas específicas de una tabla | No es lo ideal | Sí |
| Ejemplo | Nombre no vacío | Precio de oferta menor que el precio normal |
6. ¿Cuándo conviene utilizarlo?
Un DOMAIN es útil cuando varias columnas necesitan cumplir la misma regla, por ejemplo:
- Nombres que no estén vacíos.
- Cantidades que deban ser positivas.
- Códigos que deban seguir un formato específico.
- Valores numéricos dentro de un rango permitido.
No es necesario crear un dominio para cada columna. Conviene utilizarlo cuando existe una regla común que realmente merece ser reutilizada.
En resumen: un DOMAIN permite encapsular un tipo de dato y sus restricciones en una definición reutilizable. Esto reduce la duplicación de código SQL y facilita mantener las reglas de validación de una base de datos.