ユーザー定義型が PostgreSQL に既に存在するかどうかを確認する

Shihab Sikder 2023年6月20日
  1. PostgreSQL でユーザー定義型を作成する
  2. ユーザー定義型がすでに存在するかどうかを確認し、存在する場合はドロップする
ユーザー定義型が PostgreSQL に既に存在するかどうかを確認する

exists クエリを使用して、ユーザー定義型が既に定義されているかどうかを確認できます。 また、別のこともできます。型が存在する場合は削除します。

PostgreSQL でユーザー定義型を作成する

ユーザー定義型は、C および C++ の struct に似ています。 さまざまなタイプのデータを含むタイプのデータを作成できます。

Postgres の公式ドキュメントの例を次に示します。

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

実部と非実部を含む複素数を格納したいとしましょう。 これらは、それに応じて x と y に格納する必要がありました。

テーブルに 2つの列を追加するのではなく、データ型 Complex を使用できます。

ここに、次の表があります。

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;

Output:

 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)

ここで、タイプ Person を作成します。 users テーブルからいくつかの値を取得したいとしましょう。 Person を関数の戻り値の型として使用できます。

タイプ Person の作成:

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

それでは、ユーザー ID を入力として受け取り、ID、名前、年齢を返す関数を作成しましょう。 Person を返します。

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;
 id |     name      | age
----+---------------+-----
 10 | Fritz Rylance |  22
(1 row)

ユーザー定義型がすでに存在するかどうかを確認し、存在する場合はドロップする

Postgres には、上記で作成した Person タイプがあります。 ここで、タイプが存在する場合はドロップします。

1つの方法を次に示します。

DROP TYPE IF EXISTS Person;

Error:

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 にあり、使用されていることを示しています。

型が存在するかどうかを検出する別の方法は、pg_type テーブルをクエリすることです。

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

Person という名前のユーザーによって作成されたタイプがある場合、これは true を返します。 出力は次のとおりです。

 exists
--------
 t
(1 row)

PostgreSQL のユーザー定義型の詳細については、この公式の ドキュメント をお読みください。

著者: Shihab Sikder
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