Überprüfen Sie, ob ein benutzerdefinierter Typ bereits in PostgreSQL vorhanden ist

Shihab Sikder 20 Juni 2023
  1. Erstellen Sie einen benutzerdefinierten Typ in PostgreSQL
  2. Überprüfen Sie, ob ein benutzerdefinierter Typ bereits vorhanden ist, und löschen Sie ihn, wenn er vorhanden ist
Überprüfen Sie, ob ein benutzerdefinierter Typ bereits in PostgreSQL vorhanden ist

Mit der Abfrage exists können wir überprüfen, ob der benutzerdefinierte Typ bereits definiert ist oder nicht. Wir können auch etwas anderes tun: den Typ löschen, falls er existiert.

Erstellen Sie einen benutzerdefinierten Typ in PostgreSQL

Der benutzerdefinierte Typ ähnelt eher dem struct von C und C++. Wir können einen Datentyp erstellen, der verschiedene Datentypen enthält.

Hier ist ein Beispiel aus der offiziellen Dokumentation von Postgres:

typedef struct Complex {
    double      x;
    double      y;
} Complex;

Nehmen wir an, wir wollen eine komplexe Zahl mit einem reellen und einem unwirklichen Teil speichern. Diese mussten entsprechend in x und y gespeichert werden.

Wir können den Datentyp Complex verwenden, anstatt zwei Spalten in der Tabelle hinzuzufügen.

Hier haben wir folgende Tabelle:

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)

Jetzt erstellen wir einen Typ Person. Nehmen wir an, wir möchten mehrere Werte aus der Tabelle users haben; wir können die Person als Rückgabetyp der Funktion verwenden.

Erstellen des Typs Person:

CREATE TYPE Person AS (
    id INT,
    name VARCHAR,
    age  INT
);

Lassen Sie uns nun eine Funktion erstellen, die die Benutzer-ID als Eingabe verwendet und die ID, den Namen und das Alter zurückgibt. Es wird die Person zurückgegeben.

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=#

Überprüfen Sie, ob ein benutzerdefinierter Typ bereits vorhanden ist, und löschen Sie ihn, wenn er vorhanden ist

In Postgres haben wir den Typ Person, weil wir oben erstellt haben. Jetzt werden wir den Typ löschen, falls er existiert.

Hier ist eine Methode:

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=#

Hier wurde ein Fehler angezeigt, weil eine andere Funktion ihn verwendet. Wir müssen also eine Kaskadenlöschung durchführen.

Dies zeigt also an, dass sich der Typ in Postgres befindet und verwendet wurde.

Eine andere Methode, um festzustellen, ob der Typ existiert oder nicht, besteht darin, die Tabelle pg_type abzufragen.

select exists (select 1 from pg_type where typname = 'person');

Dies gibt true zurück, wenn es einen Typ gibt, der vom Benutzer namens Person erstellt wurde. Hier ist die Ausgabe:

postgres=# select exists (select 1 from pg_type where typname = 'person');
 exists
--------
 t
(1 row)

Um mehr über die benutzerdefinierten PostgreSQL-Typen zu erfahren, lesen Sie diese offizielle Dokumentation.

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