ユーザー定義型が 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 のユーザー定義型の詳細については、この公式の ドキュメント をお読みください。