Comprobar si ya existe un tipo definido por el usuario en PostgreSQL
- Crear un tipo definido por el usuario en PostgreSQL
- Comprobar si ya existe un tipo definido por el usuario y descartarlo si existe
Podemos verificar usando la consulta exists
si el tipo definido por el usuario ya está definido o no. Además, podemos hacer otra cosa: descartar el tipo si existe.
Crear un tipo definido por el usuario en PostgreSQL
El tipo definido por el usuario se parece más a la estructura
de C y C++. Podemos crear un tipo de datos que contienen diferentes tipos de datos.
Aquí hay un ejemplo de la documentación oficial de Postgres:
typedef struct Complex {
double x;
double y;
} Complex;
Digamos que queremos almacenar un número complejo con una parte real e irreal. Estos debían almacenarse en consecuencia en x e y.
Podemos usar el tipo de datos Complejo
en lugar de agregar dos columnas en la tabla.
Aquí tenemos la siguiente tabla:
create table Users (
id INT,
name VARCHAR(50),
gender VARCHAR(50),
age INT
);
-- Perform Some insert command
insert into Users values (1, 'Tymothy Blezard', 'Polygender', 21);
insert into Users values (2, 'Carlynne Renak', 'Female', 30);
insert into Users values (3, 'Hewitt Mylechreest', 'Male', 26);
insert into Users values (4, 'Griswold Geer', 'Male', 30);
insert into Users values (5, 'Kelley Vines', 'Female', 22);
insert into Users values (6, 'Ted Haizelden', 'Male', 27);
insert into Users values (7, 'Bonita Glewe', 'Female', 27);
insert into Users values (8, 'Edgar Hambers', 'Male', 22);
insert into Users values (9, 'Johnathan Dwelley', 'Male', 22);
insert into Users values (10, 'Fritz Rylance', 'Male', 22);
-- Insertion
SELECT * from Users;
id | name | gender | age
----+--------------------+------------+-----
1 | Tymothy Blezard | Polygender | 21
2 | Carlynne Renak | Female | 30
3 | Hewitt Mylechreest | Male | 26
4 | Griswold Geer | Male | 30
5 | Kelley Vines | Female | 22
6 | Ted Haizelden | Male | 27
7 | Bonita Glewe | Female | 27
8 | Edgar Hambers | Male | 22
9 | Johnathan Dwelley | Male | 22
10 | Fritz Rylance | Male | 22
(10 rows)
Ahora crearemos un tipo Persona
. Digamos que queremos tener varios valores de la tabla usuarios
; podemos usar la Persona
como tipo de retorno de la función.
Creando el tipo Persona
:
CREATE TYPE Person AS (
id INT,
name VARCHAR,
age INT
);
Ahora, creemos una función que tomará la identificación del usuario como entrada y devolverá la identificación, el nombre y la edad. Devolverá la Persona
.
CREATE OR REPLACE FUNCTION get_person (input_id int)
RETURNS Person AS
$$
SELECT
id,
name,
age
FROM
users
WHERE
users.id = input_id ;
$$
LANGUAGE SQL;
postgres=# select * from get_person(10);
id | name | age
----+---------------+-----
10 | Fritz Rylance | 22
(1 row)
postgres=#
Comprobar si ya existe un tipo definido por el usuario y descartarlo si existe
En Postgres tenemos el tipo Persona
porque arriba lo hemos creado. Ahora, descartaremos el tipo si existe.
Aquí hay un método:
postgres=# DROP TYPE IF EXISTS Person;
ERROR: cannot drop type person because other objects depend on it
DETAIL: function get_person(integer) depends on type person
HINT: Use DROP ... CASCADE to drop the dependent objects too.
postgres=#
Aquí mostró un error porque otra función lo está usando. Entonces, necesitamos realizar una eliminación en cascada.
Entonces, esto indica que el tipo está en Postgres y se ha utilizado.
Otro método para detectar si el tipo existe o no es consultar la tabla pg_type
.
select exists (select 1 from pg_type where typname = 'person');
Esto devolverá “true” si hay algún tipo creado por el usuario llamado “Persona”. Aquí está la salida:
postgres=# select exists (select 1 from pg_type where typname = 'person');
exists
--------
t
(1 row)
Para saber más sobre los tipos definidos por el usuario de PostgreSQL, lea esta documentación oficial.