Tipos De Datos Definidos Por Usuario en Postgres

Postgres permite a los usuarios extender los tipos de datos tradicionales con otros definidos, a partir de valores compuestos. esto se puede hacer a través de dos comandos diferentes CREATE DOMAIN y CREATE TYPE.

A continuación analizaremos el uso de ambos y las circunstancias en las que conviene aplicar uno u otro.

CREATE DOMAIN

En PostgreSQL un dominio es un tipo de datos con restricciones opcionales como NOT NULL, CHECK etcétera. Un dominio tiene un nombre único dentro del esquema.

Los dominios son útiles para centralizar el manejo de campos con restricciones comunes por ejemplo que no sean nulos y que no contengan espacios:

el siguiente comando crea una tabla para guardar una lista de correos

CREATE TABLE mail_list (
    ID serial PRIMARY KEY,
    first_name VARCHAR NOT NULL,
    last_name VARCHAR NOT NULL,
    email VARCHAR NOT NULL,
    CHECK (
    first_name !~ '\s'
    AND last_name !~ '\s'
    )
);

Esta tabla first_name y last_name no son nulos y no deben contener espacios, para facilitar la administración y la calidad de los datos, se puede crear un dominio contact_name que enfuerce estas restricciones:

CREATE DOMAIN contact_name AS VARCHAR NOT NULL CHECK VALUE (value !~ '\s');

Aplicando este dominio a nuestra lista de correos

CREATE TABLE mail_list (
    ID serial PRIMARY KEY,
    first_name contact_name,
    last_name contact_name,
    email VARCHAR NOT NULL,
);

Para cambiar o eliminar un dominio podemos usar los verbos ALTER DOMAIN y DROP DOMAIN respectivamente

CREATE TYPE

El comando CREATE TYPE permite la creación de un tipo de datos compuesto, el cual puede ser utilizado como el tipo de datos resultado de una función Por ejemplo, el siguiente SQL define un tipo de dato para valores de color RGB:

CREATE TYPE rgb as (red int, green int, blue int);

una vez que tenemos definido nuestro tipo de dato, podemos crear una función que nos devuelve el color de una muestra en formato RGB

CREATE OR REPLACE FUNCTION get_rgb_code(s_id INT)
    RETURNS rgb AS
$$
    SELECT
    red,
    green,
    blue
    FROM samples
    WHERE sample_id = s_id;
$$
LANGUAGE SQL;

Para alterar o borrar los tipos usamos los verbos ATER TYPE y DROP TYPE.