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
.