HOWTO · PostgreSQL

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

Podemos usar un script para verificar si el tipo ya existe o no. La consulta sobre pg_type puede informarnos si el tipo definido por el usuario existe o no.

En esta página

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.