列挙型
PostgreSQLでNavicat Premium 17 を使用してカスタムデータ型を作成するこのシリーズでは、これまでにいくつかのオプションを検討してきました。パート1では、無料のDVDレンタルデータベース用のカスタムドメインを作成する方法を学びました。先週は、ユーザー定義関数から複雑なデータを返す複合型を作成しました。今日のブログでは、値を定義済みオプションのセットに制限する列挙型について説明します。
ENUM 型の概要
列挙型 (ENUM) を使用すると、静的で順序付けられた値の集合を持つデータ型を定義できます。これは、列が定義済みの限られた値のいずれかを含まなければならない場合に役立ちます
他の PostgreSQL 型と同様に、ENUM 型は CREATE TYPE ステートメントを使用して作成されます。4つのユーザーステータスを定義する ENUM を次に示します。
CREATE TYPE user_status AS ENUM ('active', 'inactive', 'suspended', 'pending');
映画のレーティングを定義する別の例を次に示します。:
CREATE TYPE movie_rating AS ENUM ('G', 'PG', 'PG-13', 'R', 'NC-17');
定義したら、次のようにテーブルでカスタム型を使用できます。
CREATE TABLE films ( film_id SERIAL PRIMARY KEY, title VARCHAR(255), rating movie_rating );
Navicat 17 で列挙型を作成する
列挙型を定義する簡単な方法は、Navicat の GUI ベースのツールを使用することです。これは Navicat Premium 17 と Navicat for PostgreSQL 17 の両方で使用できます。タイプツールにアクセスするには、メインツールバーの [その他] をクリックし、ドロップダウンから [タイプ] を選択します。

すると、「オブジェクト」ペインが表示され、既存の型のリストが表示されます。新しい型を作成するには、「オブジェクト」ツールバーの「新しい型」項目の横にある矢印をクリックし、コンテキストメニューから「Enum」項目を選択します。

「Type designer」が新しいタブで起動します。[General] タブに空のセルが表示され、そこに列挙型(Enum)の最初のラベル、例えば "G" を入力できます。

「Add Label(ラベルを追加)」をクリックすると、新しい行を追加して次のラベルを入力できます。すべてのラベルを入力すると、「General」タブは次のようになります。

「保存」ボタンをクリックする前に、「SQLプレビュー」タブをクリックすることで、Navicatが生成するステートメントを確認できます。

定義をまだ保存していないため、型名は「Untitled」になっています。これは想定どおりです。
「保存」ボタンをクリックすると、「名前を付けて保存」ダイアログが表示され、そこで型に名前を付けることができます。「film_rating」と入力しましょう。

テーブル定義での film_rating 型の使用
これで、"film_rating" 型を他の PostgreSQL データ型と同じように使用できます。たとえば、テーブルの列をカスタム型に設定できます。既存のテーブルの型を変更することもできます。ただし、そのデータ値が列挙型の値に準拠している必要があります。実際、列の型を汎用の VARCHAR からより厳密な ENUM に変更することは、列に無効な値が含まれているかどうかをすばやく判断する効率的な方法です。
Navicat Table Designer で "film" テーブルを開くと、"rating" 列を "film_rating" 型に設定できます。そのためには、"Type" ドロップダウンから "(Type)" を選択し、"Object Type" を "film_rating" に設定します。

また、「照合順序」フィールドが空白であることを確認してください。
カラムに無効な値が含まれていない場合、エラーや警告なしにテーブル定義を保存できるはずです。
カラムの型をENUMに設定する利点の1つは、Navicatが値を選択するためのドロップダウンを提供することです。

まとめ
今日のブログでは、Navicat Premium 17 のタイプツールを使用して列挙型を作成し、既存のテーブルを更新してカスタム型を利用することで列の値を制限しました。パート4では範囲型に進みます。