無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

CREATE TYPE

名前

CREATE TYPE -- 新しいデータ型を定義する

概要

CREATE TYPE 

name

 AS
    ( [ 

attribute_name

 

data_type

 [ COLLATE 

collation

 ] [, ... ] ] )

CREATE TYPE 

name

 AS ENUM
    ( [ '

label

' [, ... ] ] )

CREATE TYPE 

name

 AS RANGE (
    SUBTYPE = 

subtype


    [ , SUBTYPE_OPCLASS = 

subtype_operator_class

 ]
    [ , COLLATION = 

collation

 ]
    [ , CANONICAL = 

canonical_function

 ]
    [ , SUBTYPE_DIFF = 

subtype_diff_function

 ]
)

CREATE TYPE 

name

 (
    INPUT = 

input_function

,
    OUTPUT = 

output_function


    [ , RECEIVE = 

receive_function

 ]
    [ , SEND = 

send_function

 ]
    [ , TYPMOD_IN = 

type_modifier_input_function

 ]
    [ , TYPMOD_OUT = 

type_modifier_output_function

 ]
    [ , ANALYZE = 

analyze_function

 ]
    [ , INTERNALLENGTH = { 

internallength

 | VARIABLE } ]
    [ , PASSEDBYVALUE ]
    [ , ALIGNMENT = 

alignment

 ]
    [ , STORAGE = 

storage

 ]
    [ , LIKE = 

like_type

 ]
    [ , CATEGORY = 

category

 ]
    [ , PREFERRED = 

preferred

 ]
    [ , DEFAULT = 

default

 ]
    [ , ELEMENT = 

element

 ]
    [ , DELIMITER = 

delimiter

 ]
    [ , COLLATABLE = 

collatable

 ]
)

CREATE TYPE 

name

説明

CREATE TYPE は、現在のデータベースで使用できる新しいデータ型を登録します。 型を定義したユーザがその所有者となります。

スキーマ名が与えられている場合、型は指定されたスキーマで作成されます。 スキーマ名がなければ、その型は現在のスキーマで作成されます。 型名は、同じスキーマにある既存の型もしくはドメインとは、異なる名前にする必要があります (さらに、テーブルはデータ型と関連しているため、データ型名は同じスキーマのテーブル名とも競合しないようにしてください)。

上の構文概要に示すように、 CREATE TYPE には5つの構文があります。 これらはそれぞれ、 複合型 , 列挙型 範囲型 基本型 シェル型 を作成します。 これらの内最初の4個についてはここで順番に説明します。 シェル型は、単なる、後で定義される型用のプレースホルダです。 これは型名以外のパラメータを持たずに CREATE TYPE を実行することで作成されます。 シェル型は、それぞれの節で説明するように範囲型と基本型を作成するときの前方参照として必要なものです。

複合型

CREATE TYPE の最初の構文を使用すると、複合型を作成できます。 複合型は、列名およびデータ型のリストにより指定されます。 データ型の照合順序が設定可能である場合、属性の照合順序も指定することができます。 複合型は本質的にはテーブルの行型と同じです。 しかし、型を定義するだけであれば、 CREATE TYPE を使用することで、実際のテーブルを作成する必要をなくすことができます。 スタンドアロンの複合型は、例えば関数の引数や戻り値の型として使用すると有用です。

複合型を作成するためには、すべての属性型に対して USAGE 権限を持たなければなりません。

列挙型

CREATE TYPE の2つ目の構文を使用すると、 項8.7 で説明する列挙型(enum)を作成します。 列挙型は、1つ以上の引用符付きのラベルのリストを取ります。 ラベルは NAMEDATALEN PostgreSQL を標準で構築した場合は64バイト)バイトよりも少ない長さでなければなりません。

範囲型

CREATE TYPE の三番目の構文は、 項8.17 で説明する範囲型を新規に作成します。

範囲型の subtype は、関連する(範囲型の値を順序を決定するための)b-tree演算子クラスを持つ任意の型を取ることができます。 通常、派生元型のデフォルトのb-tree演算子クラスが順序を決定するために使用されます。 デフォルト以外の演算子クラスを使用するためには、 subtype_opclass でその名前を指定してください。 派生元型が照合順序変更可能であり、範囲の順序付けでデフォルト以外の照合順序を使用したい場合は、 collation オプションで使用したい照合順序を指定してください。

省略可能な canonical 関数は、定義する範囲型の引数を1つ取り、同じ型の値を返さなければなりません。 これは適切な時に範囲値を正規形式に変換するために使用されます。 詳細については 項8.17.8 を参照してください。 範囲型を定義できるようになる前に定義されている必要があるため、 canonical 関数を作成することは多少厄介です。 このためには、まず、名前と所有者以外の属性を持たないプレースホルダであるシェル型を作成しなければなりません。 これは、他にパラメータを持たない CREATE TYPE name を実行することで行われます。 その後、このシェル型を引数と結果として使用する関数を宣言することができます。 最後に同じ名前を用いて範囲型を宣言することができます。 これは自動的にシェル型の項目と有効な範囲型に置き換えます。

省略可能な subtype_diff 関数は、 subtype 型の2つの値を引数として取り、与えられた2つの値の差異を表す double precision 型を返さなければなりません。 これは省略することができますが、提供することでその範囲型の列に対するGiSTインデックスの効率を大きく向上させることができます。 詳細については 項8.17.8 を参照してください。

基本型

CREATE TYPE の4つ目の構文を使用すると、基本型(スカラ型)を新しく作成できます。 新しい基本型を作成するにはスーパーユーザでなければなりません。 (エラーがある型定義が混乱を招き、サーバがクラッシュすることすらあるため、この制限がなされました。)

パラメータは、上述の順番である必要はなく、任意の順番で指定することができます。 型を定義する前に、( CREATE FUNCTION を用いて)2つ以上の関数を登録しておく必要があります。 サポート関数である input_function output_function は必須です。 receive_function 関数、 send_function 関数、 type_modifier_input_function 関数、 type_modifier_output_function 関数、および analyze_function 関数は省略可能です。 通常、これらの関数は、C言語やその他の低レベル言語で作成されなければなりません。

input_function は、型のテキストによる外部表現を内部表現形式に変換するものであり、その型用に定義される演算子や関数で使用されます。 output_function はこの逆の変換を行うものです。 入力関数は、1つの cstring 型の引数、あるいは、 cstring 型、 oid 型、 integer 型という3つの引数を取るように宣言されます。 最初の引数にはC文字列の入力テキスト、2番目には型自体のOID(配列型の場合は例外で要素の型のOIDとなります)、3番目は、判明していれば対象列の typmod を渡します (不明な場合は-1を渡します)。 この入力関数では、データ型自身の値を返さなければなりません。 通常入力関数はSTRICTとして宣言しなければなりません。 そうしないと、NULLという入力値を読み取った時、NULLという最初のパラメータを持って呼び出されます。 この場合でも関数はNULLを返さなければなりません。 さもなくばエラーになります。 (こうした状況はほとんどの場合、ドメイン入力関数をサポートすることを意図しています。ドメイン入力関数ではNULL入力を拒絶する可能性があります。) 出力関数は、新しいデータ型の引数を1つ取るように宣言しなければなりません。 出力関数は、 cstring 型を返さなければなりません。 出力関数はNULL値に対して呼び出されることはありません。

receive_function では、型のバイナリによる外部表現を内部表現に変換します。この関数は省略可能です。 この関数が与えられない場合、この型ではバイナリ入力を行うことができません。 バイナリ表現の方法は、適度な移植性を保ちつつ、内部表現への変換コストが小さくなるよう選択すべきです (例えば標準の整数データ型は、外部バイナリ表現としてはネットワークバイトオーダを使用し、内部表現ではマシン固有のバイトオーダを使用します)。 この受信関数では、値が有効かどうかを判定するための適切な検査を行わなければなりません。 受信関数は、 internal 型の引数1つ、または、 internal 型と oid integer 型の3つの引数を取るように宣言されます。 最初の引数は受信したバイト文字列を保持する StringInfo バッファへのポインタ、省略可能な引数は、入力関数の説明と同じです。 そして、データ型自体の値を返す必要があります。 通常受信関数はSTRICTとして宣言しなければなりません。 そうしないと、NULLという入力値を読み取った時、NULLという最初のパラメータを持って呼び出されます。 この場合でも関数はNULLを返さなければなりません。 さもなくばエラーになります。 (こうした状況はほとんどの場合、ドメイン受信関数をサポートすることを意図しています。ドメイン受信関数ではNULL入力を拒絶する可能性があります。) 同様に、 send_function は、内部表現からバイナリによる外部表現に変換します。この関数も省略可能です。 この関数が与えられない場合、この型ではバイナリ出力を行うことができません。 この送信関数は、新しいデータ型の引数1つを取るように宣言しなければなりません。 送信関数は bytea 型を返さなければなりません。 送信関数はNULL値に対して呼び出されません。

ここで、新しいデータ型を作成する前に入力関数と出力関数を作成する必要があるのに、どのようにしてそれらの関数で新しいデータ型を戻り値や入力として宣言できるのか、疑問に思うかもしれません。 その答えは、まず型が最初に シェル型 として定義されます。 この型はプレースホルダ型であり、名称と所有者以外の属性を持ちません。 これは、他にパラメータを持たない CREATE TYPE name コマンドを発行することで行われます。 この後、入出力関数をこのシェル型を参照するように定義することができます。 最後に完全な定義を持った CREATE TYPE によって、シェル型の項目が完全かつ有効な型定義に置き換わり、新しい型を普通に使用することができるようになります。

type_modifier_input_function type_modifier_output_function は省略可能ですが、型が修正子をサポートする場合は必要です。 修正子とは、 char(5) numeric(30,2) などの省略可能な型宣言に付与される制約です。 PostgreSQL では、ユーザ定義型が1つ以上の整数定数または識別子を修正子として取ることができます。 しかし、この情報はシステムカタログに格納される時に単一非負の整数にまとめられるものでなければなりません。 type_modifier_input_function には、 cstring 型配列の形で宣言された修正子が渡されます。 その値について妥当性を検査しなければなりません(不当な場合はエラーとします)。 そして、正しい場合は、 "typmod" 列として格納される、単一非負の integer 値を返さなければなりません。 型が type_modifier_input_function を持たない場合、型修正子は拒否されます。 type_modifier_output_function は内部的な整数typmod値をユーザ側の表示に合わせて変換します。 この関数は型名に付与する正確な文字列となる cstring 値を返さなければなりません。 たとえば numeric 用の関数では (30,2) を返すかもしれません。 デフォルトの表示用書式が保管されたtypmod整数値を括弧で括ったものと一致している場合は、 type_modifier_output_function を省略することができます。

analyze_function は、このデータ型の列に対する、型固有の統計情報の収集を行います。この関数は省略可能です。 デフォルトでは、その型用のデフォルトのB-tree演算子クラスがあれば、 ANALYZE は型の "等価" 演算子と "小なり" 演算子を使用して統計情報を集めようと試みます。 非スカラ型には、この振舞いはあまり適していません。 そのため、独自の解析関数を指定すると、この振舞いを上書きすることができます。 この解析関数は、 internal 型の引数を1つ取り、戻り値として boolean を返すように宣言する必要があります。 解析関数用のAPIの詳細は、 src/include/commands/vacuum.h にあります。

新しい型の内部表現の詳細を理解しなければならないのは、これらのI/O関数とその型に関連して動作するユーザ定義の関数のみですが、内部表現には、 PostgreSQL に対し宣言しなければならない複数の属性値があります。 属性の中で最も重要なものは internallength です。 基本データ型は、 internallength に正の整数を指定して固定長として作成するだけでなく、 internallength VARIABLE と設定し可変長として作成することもできます (内部的には、これは typlen を-1に設定することで表現されます)。 全ての可変長型の内部表現は、型の値の全長を示す4バイトの整数値から始まらなければなりません。

PASSEDBYVALUE フラグは、このデータ型の値が参照ではなく値によって渡されることを示します。このフラグは省略可能です。 Datum 型のサイズ(ほとんどのマシンでは4バイトだが、まれに8バイト)よりも長い内部表現の型は値で渡すことができません。

alignment パラメータは、そのデータ型の格納の際に整列が必要であることを示します。 設定可能な値は、1、2、4、8バイト境界での整列と同じです。 可変長型の位置配置は最低でも4を持たなければならないことに注意してください。 最初の要素として int4 を持たなければならないからです。

storage パラメータを使用することで、可変長データ型を格納する際の戦略を選択することができます (固定長の型には plain のみが使用できます)。 plain を指定すると、その型のデータは常にインラインで格納され、圧縮されません。 extended を指定すると、システムはまず長いデータ値を圧縮しようとし、それでもまだ長過ぎる場合は値をメインテーブルの行から削除して移動します。 external はメインテーブルから値を削除して移動することを許しますが、システムはデータを圧縮しようとしません。 main はデータの圧縮を許し、できるだけ値をメインテーブルから削除しないようにします (行を収めるために他に方法がない場合にはメインテーブルから削除されてしまう可能性がありますが、 extended external が指定されたアイテムよりも優先してメインテーブルに残されます)。

like_type パラメータは、何らかの既存のデータ型から複製するという、データ型の基本表現プロパティを指定する、別の方法を提供します。 internallength passedbyvalue alignment storage の値が指定された型から複製されます。 (普通好まれませんが、 LIKE 句と一緒にこれらの値を指定することで、値を上書きすることも可能です。) 新しい型の低レベル実装にある流儀に従った既存の型を "移す" 時に、この方法で表現を指定することが特に有用です。

category preferred パラメータは、暗黙的なキャストがあいまいな状況で適用されるかどうかについての制御を補助するために使用することができます。 各データ型は単一のASCII文字で命名されるカテゴリに属しています。 そして、各型はそのカテゴリで "好まれる(preferred)" か否かを持ちます。 パーサは(同一のカテゴリ内の他の型からの)好まれる型へのキャストを、この規則が上書きされた関数または演算子の解決に有用な場合に優先します。 より詳細は 第10章 を参照してください。 他の型への、または、ほかの型からの暗黙的なキャストを持たない型では、これらの設定をデフォルトのままにしておくことで十分です。 しかし、暗黙的なキャストを持つ関連するグループでは、それらすべてをカテゴリに属し、その1つまたは2つをカテゴリ内で好まれるものとして "最も一般的な" 型として選択することが有用となる場合が多くあります。 ユーザ定義型を、数値型や文字列型などの既存の組み込みカテゴリに追加する場合に、 category パラメータは特に有用です。 しかし、すべてがユーザ定義型のカテゴリを作成することもできます。 カテゴリとして命名されていない任意の大文字を選択してください。

ユーザがそのデータ型の列のデフォルトをNULL以外にしたい場合は、デフォルト値を指定することができます。 デフォルト値は DEFAULT キーワードで指定してください (この方法で指定されたデフォルト値は、特定の列に付与された、明示的な DEFAULT 句によって上書きされる可能性があります)。

データ型が配列であることを示すには、 ELEMENT キーワードを使用して配列要素の型を指定してください。 例えば、4バイト整数( int4 )の配列を定義するには、 ELEMENT = int4 と指定してください。 詳細は後述の配列型で説明します。

この型による配列の外部形式における値間の区切り文字を示すために、 delimiter で特定の文字を設定することができます。 デフォルトの区切り文字はカンマ(' , ')です。 この区切り文字は、配列要素の型に関係するものであり、配列型自体に関係するものでないことに注意してください。

省略可能な論理型の collatable パラメータが真の場合、 COLLATE 句を使用することによって、列定義と型の式は照合順序情報を持つことができます。 照合順序情報を実際に使用するかどうかは、型に対する操作を行う関数実装に任されています。 照合順序を設定可能な型を作成することにより、これが自動的に行われることはほとんどありません。

配列型

ユーザ定義型が作成されると、 PostgreSQL は、自動的に、その要素型の名前の前にアンダースコアを付け、必要に応じて NAMEDATALEN 長より短くなるように切り詰められた名前を持つ、関連する配列型を作成します。 (こうして付けられた名前が既存の型名と競合する場合、競合する名称がなくなるまでこの処理が繰り返されます。) この暗黙的に作成される配列型は可変長で、組み込み入出力関数 array_in array_out を使用します。 配列型はその要素となる型の所有者とスキーマのなんらかの変更に追従し、また、要素となる型が削除された場合に削除されます。

理論的に考えると、「システムが自動的に配列型を正しく作成するのであれば、 ELEMENT オプションはどうして存在するのだろう」と不思議に思うでしょう。 ELEMENT が意味を持つ、唯一の場合は次のような条件を満たす固定長の型を作成する時です。 その条件とは、内部的に大量の同一の要素からなる配列となっていること、その配列に対して添字を指定して直接アクセスできること、加えて、今後作成する型全体に対する操作がどのようなものであっても、それらから直接アクセスできることです。 例えば、 point 型では、その構成要素である2つの浮動小数点にそれぞれ point[0] および point[1] を用いてアクセスすることができます。 この機能は、その内部形式が同一の固定長フィールドの正確な並びである、固定長の型でのみ動作することに注意してください。 添字による指定が可能な可変長型は、 array_in array_out を使用して、一般化された内部表現を持つ必要があります。 歴史的な理由(明らかに間違いなのですが、変更するには遅すぎたため)により、固定長配列型への要素番号指定は0から始まり、可変長配列の場合は1から始まります。

パラメータ

name

作成するデータ型の名前です(スキーマ修飾名も可)。

attribute_name

複合型用の属性(列)名です。

data_type

複合型の列となる、既存のデータ型の名前です。

collation

複合型の列または範囲型に関連付けされる、既存の照合順序の名前です。

label

列挙型の1つの値に関連付けられるテキスト形式のラベルを表す、文字列リテラルです。

subtype

範囲型がその範囲の対象として表現する、要素型の名前です。

subtype_operator_class

派生元型のb-tree演算子クラスの名前です。

canonical_function

範囲型の正規化関数の名前です。

subtype_diff_function

派生元型の差異をとる関数の名前です。

input_function

指定された型のテキストによる外部形式のデータを内部形式に変換する関数の名前です。

output_function

指定された型の内部形式のデータをテキストによる外部形式に変換する関数の名前です。

receive_function

指定された型のバイナリによる外部形式のデータを内部形式に変換する関数の名前です。

send_function

指定された型の内部形式のデータをバイナリによる外部形式に変換する関数の名前です。

type_modifier_input_function

型に関する修正子の配列を内部形式に変換する関数の名前です。

type_modifier_output_function

内部形式の型修正子をテキストの外部形式に変換する関数の名前です。

analyze_function

指定したデータ型の統計情報解析を行う関数の名前です。

internallength

新しいデータ型の内部表現のバイト長を表す数値定数です。 デフォルトでは、可変長であるとみなされます。

alignment

データ型の格納整列条件です。 このオプションを指定する場合は、 char int2 int4 double のいずれかでなければなりません。 デフォルトは int4 です。

storage

データ型の格納戦略です。 このオプションを指定する場合は、 plain external extended main のいずれかでなければなりません。 デフォルトは plain です。

like_type

新しい型に同じ表現を持たせる既存のデータ型の名前です。 internallength passedbyvalue alignment storage の値が、この CREATE TYPE コマンドのどこかで明示的な指定により上書きされない限り、型から複製されます。

category

この型用のカテゴリコード(単一のASCII文字)です。 デフォルトは "ユーザ定義型" を表す 'U' です。 他の標準カテゴリコードを 表47-52 に示します。 独自のカテゴリを作成するために他のASCII文字を選択することもできます。

preferred

この型がカテゴリ内で好まれる型である場合に真、さもなくば偽です。 デフォルトは偽です。 動作に予想外の変化を引き起こしますので既存の型カテゴリに新しく好まれる型を作成することには十分注意してください。

default

そのデータ型のデフォルト値です。 省略された場合、デフォルトはNULLです。

element

配列型を作成する場合、その配列の要素の型を指定します。

delimiter

このデータ型による配列で、値間の区切り文字として使われる文字です。

collatable

この型を操作する時に照合順序情報を使用することができる場合に真を取ります。 デフォルトは偽です。

注釈

一度作成したデータ型の使用には制限はありませんので、基本型または範囲型の作成は型定義で言及した関数の実行権をPUBLICに対して付与することと同じです。 この種の型定義において有用な関数では、これは通常問題になりません。 しかし、型を設計する前に、外部形式から、または、外部形式への変換を行う時に、その関数が "秘密の" 情報を必要とするかどうか熟考してください。

PostgreSQL バージョン8.3より前のバージョンでは、生成される配列型の名前は常に要素型の名前の前に1つのアンダースコア文字( _ )を付けたものになりました。 (このため型の名前は他の名前よりも1文字短く制限されていました。) 通常はこのように名付けられることは変わりありませんが、最大長の名前の場合やアンダースコアから始まるユーザ定義の型と競合する場合、配列型の名前は変わることがあります。 このため、この変換に依存したコードを書くことは避けてください。 代わりに、 pg_type . typarray を使用して、指定した型に関した配列型を特定してください。

アンダースコアから始まる型やテーブル名の使用を避けることが賢明です。 サーバは生成された配列型名称をユーザ指定の名前と競合しないように変更しますが、混乱する危険があります。 特に古いクライアントソフトウェアを使用する場合、名前がアンダースコアから始まる型を常に配列を表すものと仮定しているかもしれません。

PostgreSQL バージョン8.2より前まででは、シェル型を作成する CREATE TYPE name 構文は存在しません。 新規に基本型を作成する方法は、最初に入力関数を作成することでした。 この方法では、 PostgreSQL はまず新しいデータ型の名称を、入力関数の戻り値型から判断します。 この場合、シェル型が暗黙的に作成され、残りの入出力関数の定義で参照することができます。 この方法もまだ使用できますが、廃止予定で将来のリリースでなくなる可能性があります。 また、関数定義における単純な打ち間違いの結果作成されるシェル型によって起こるカタログの混乱を防止するため、入力関数がCで作成された場合にのみこの方法によってシェル型が作成されます。

PostgreSQL 7.3より前のバージョンでは、関数の下位参照を、プレースホルダとなる疑似データ型である opaque 型のデータ型名と置き換えることによって、shell型を作成することを完全に、慣習的に避けていました。 また、7.3より前のバージョンでは、 cstring 型の引数および結果も opaque 型として宣言する必要がありました。 古いダンプファイルのロードをサポートするため、 CREATE TYPE では opaque 型を使用するよう宣言された入出力関数を受け入れます。 しかし、注意を促すメッセージを表示し、正しいデータ型を使用するように関数の宣言を変更します。

次の例では、複合型を作成し、それを関数定義で使用します。

CREATE TYPE compfoo AS (f1 int, f2 text);
CREATE FUNCTION getfoo() RETURNS SETOF compfoo AS $$
    SELECT fooid, fooname FROM foo
$$ LANGUAGE SQL;

次の例では、列挙型を作成し、それをテーブル定義に使用します。

CREATE TYPE bug_status AS ENUM ('new', 'open', 'closed');

CREATE TABLE bug (
    id serial,
    description text,
    status bug_status
);

次の例では、範囲型を作成します。

CREATE TYPE float8_range AS RANGE (subtype = float8, subtype_diff = float8mi);

次の例では、 box 基本データ型を作成し、その型をテーブル定義の中で使用しています。

CREATE TYPE box;

CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ;
CREATE FUNCTION my_box_out_function(box) RETURNS cstring AS ... ;

CREATE TYPE box (
    INTERNALLENGTH = 16,
    INPUT = my_box_in_function,
    OUTPUT = my_box_out_function
);

CREATE TABLE myboxes (
    id integer,
    description box
);

box 型の内部構造が float4 型が4つ並んだ配列の場合、このように書き換えることもできます。

CREATE TYPE box (
    INTERNALLENGTH = 16,
    INPUT = my_box_in_function,
    OUTPUT = my_box_out_function,
    ELEMENT = float4
);

このようにすると、box値の要素に要素番号でアクセスできます。 その他は、上の例と同様の動作をします。

次の例では、ラージオブジェクト型を作成し、テーブル定義にてそれを使用します。

CREATE TYPE bigobj (
    INPUT = lo_filein, OUTPUT = lo_fileout,
    INTERNALLENGTH = VARIABLE
);
CREATE TABLE big_objs (
    id integer,
    obj bigobj
);

その他の例は、 項35.11 を参照してください。ここには、入力関数、出力関数などを使った例があります。

互換性

複合型を作成する、最初の CREATE TYPE コマンドの構文は標準 SQL に従います。 他の構文は PostgreSQL の拡張です。 標準 SQL ではまた他の CREATE TYPE 構文を定義していますが、 PostgreSQL では実装されていません。

ゼロ個の要素を持つ複合型を作成する機能は標準から派生した PostgreSQL 固有のもの( CREATE TABLE の場合と同様)です。

関連項目

ALTER TYPE , CREATE DOMAIN , CREATE FUNCTION , DROP TYPE

powered by SEO.CUG.NET