Comprobar si ya existe un tipo definido por el usuario en PostgreSQL

Shihab Sikder 8 octubre 2023
  1. Crear un tipo definido por el usuario en PostgreSQL
  2. Comprobar si ya existe un tipo definido por el usuario y descartarlo si existe
Comprobar si ya existe un tipo definido por el usuario en PostgreSQL

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.

Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website