CREATE TABLE ステートメントは表を定義します。 定義には、その表の名前と、その列の名前および属性を含める必要があります。 定義には、基本キーや検査制約などの表の他の属性を含めることができます。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、 または動的 SQL ステートメントを使用して発行することができます。 このステートメントは、動的に準備可能な実行可能ステートメントです。 しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、 ステートメントを動的に準備することはできません (SQLSTATE 42509)。
許可
このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。
データベースに対する CREATETAB 権限および表スペースに対する USE 特権と、 以下の特権のうちの 1 つ。
副表を定義する場合には、許可 ID は表階層のルート表の定義者と同じでなければなりません。
外部キーを定義する場合には、ステートメントの許可 ID が保持する特権として、 親表に対する以下のいずれかが必要になります。
(全選択を使用して) 要約表を定義するには、このステートメントの許可 ID に、 全選択で識別された個々の表または視点に対する以下の特権が少なくとも 1 つ含まれている必要があります。
>>-CREATE--+----------+---TABLE--table-name---------------------> '-SUMMARY--' >-----+-| element-list |------------------------------+---------> +-OF--type-name1--+--------------------------+--+ | '-| typed-table-options |--' | +-| summary-table-definition |------------------+ '-LIKE--+-table-name1-+---+-------------------+-' +-view-name---+ '-| copy-options |--' '-nickname----' .-DATA CAPTURE NONE----. >----*--+----------------------+--*-----------------------------> '-DATA CAPTURE CHANGES-' >-----+-----------------------------------------------+--*------> '-IN--tablespace-name1--| tablespace-options |--' >-----+------------------------------------------------------------+> | .-,---------. | | V | .-USING HASHING--. | +-PARTITIONING KEY--(-----column---+---)--+----------------+-+ '-REPLICATED-------------------------------------------------' >----*--+----------------------+---*--------------------------->< '-NOT LOGGED INITIALLY-' element-list .-,---------------------------------. V | |---(------+-| column-definition |------+--+---)----------------| +-| unique-constraint |------+ +-| referential-constraint |-+ '-| check-constraint |-------' typed-table-options |---+----------------------------+---+-------------------------+-> +-HIERARCHY--hierarchy-name--+ '-| typed-element-list |--' '-| under-clause |----------' >---------------------------------------------------------------| under-clause |---UNDER--supertable-name--INHERIT SELECT PRIVILEGES-----------| typed-element-list .-,--------------------------------. V | |---(------+-| OID-column-definition |-+--+---)-----------------| +-| with-options |----------+ +-| unique-constraint |-----+ '-| check-constraint |------'
summary-table-definition |--+----------------------------+---AS--(--fullselect--)--| summary-table-options |--> | .-,--------------. | | V | | '-(-----column-name---+---)--' >---------------------------------------------------------------| summary-table-options |---+-DEFINITION ONLY--+-------------------+-+------------------| | '-| copy-options |--' | '-| refreshable-table-options |----------' copy-options |---*----+----------------------------------------+--*----------> | .-COLUMN-. | '--+-INCLUDING-+--+--------+--DEFAULTS---' '-EXCLUDING-' .-COLUMN ATTRIBUTES-. .-EXCLUDING IDENTITY--+-------------------+--. >-----+--------------------------------------------+--*---------| | .-COLUMN ATTRIBUTES-. | '-INCLUDING IDENTITY-+-------------------+---' refreshable-table-options |---DATA INITIALLY--DEFERRED--REFRESH--+-DEFERRED--+------------> '-IMMEDIATE-' .-ENABLE QUERY OPTIMIZATION--. >-------+----------------------------+--------------------------| '-DISABLE QUERY OPTIMIZATION-'
tablespace-options |--+----------------------------------+-------------------------> | (1) | '-INDEX IN--tablespace-name2-------' >-----+----------------------------+----------------------------| '-LONG IN--tablespace-name3--' column-definition |---column-name----+---------------------+----------------------> | (2) | '-| data-type |-------' >-----+---------------------+-----------------------------------| '-| column-options |--' column-options .---------------------------------------------------------------------------------. V | |------+---------------------------------------------------------------------------+--+-> +-NOT NULL------------------------------------------------------------------+ | (3) | +-| lob-options |-----------------------------------------------------------+ | (4) | +-| datalink-options |------------------------------------------------------+ | (5) | +-SCOPE--+-typed-table-name-+-----------------------------------------------+ | '-typed-view-name--' | +-+-----------------------------------+---+-+-PRIMARY KEY-+---------------+-+ | | (6) | | '-UNIQUE------' | | | '-CONSTRAINT-------constraint-name--' +-| references-clause |---------+ | | '-CHECK--(--check-condition--)--' | | (7) | +-| column-default-spec |---------------------------------------------------+ | (8) | '-INLINE LENGTH--integer----------------------------------------------------' >---------------------------------------------------------------|
注:
data-type |--+-SMALLINT-----------------------------------------------------------------------+-> +-+-INTEGER-+--------------------------------------------------------------------+ | '-INT-----' | +-BIGINT-------------------------------------------------------------------------+ +-+-FLOAT--+----------------+-+--------------------------------------------------+ | | '-(--integer--)--' | | | +-REAL----------------------+ | | | .-PRECISION-. | | | '-DOUBLE-+-----------+------' | +--+-DECIMAL-+---+--------------------------------+------------------------------+ | +-DEC-----+ '-(--integer--+-----------+---)--' | | +-NUMERIC-+ '-,integer--' | | '-NUM-----' | +--+--+-CHARACTER-+---+------------+----------------+---+----------------------+-+ | | '-CHAR------' '-(integer)--' | | (1) | | | +--+-VARCHAR-------------------+--(--integer--)--+ '--------FOR BIT DATA--' | | | '--+-CHARACTER-+---VARYING--' | | | | '-CHAR------' | | | '-LONG VARCHAR-----------------------------------' | | | +--+-BLOB---+--(--integer--+---+---)---------------------------------------------+ | +-CLOB---+ +-K-+ | | '-DBCLOB-' +-M-+ | | '-G-' | +-GRAPHIC--+------------+--------------------------------------------------------+ | '-(integer)--' | +-VARGRAPHIC--(integer)----------------------------------------------------------+ +-LONG VARGRAPHIC----------------------------------------------------------------+ +-DATE---------------------------------------------------------------------------+ +-TIME---------------------------------------------------------------------------+ +-TIMESTAMP----------------------------------------------------------------------+ +-DATALINK--+----------------+---------------------------------------------------+ | '-(--integer--)--' | +-distinct-type-name-------------------------------------------------------------+ +-structured-type-name-----------------------------------------------------------+ '-REF--(type-name2)--------------------------------------------------------------' >---------------------------------------------------------------|
注:
default-values |--+-constant---------------------------------------------+-----| +-datetime-special-register----------------------------+ +-USER-------------------------------------------------+ +-NULL-------------------------------------------------+ '-cast-function--(--+-constant------------------+---)--' +-datetime-special-register-+ '-USER----------------------' lob-options .-LOGGED-----. .-NOT COMPACT--. |---*--+------------+---*--+--------------+---*-----------------| '-NOT LOGGED-' '-COMPACT------' datalink-options |---LINKTYPE URL------------------------------------------------> .-NO LINK CONTROL------------------------------. >----+----------------------------------------------+-----------| '-FILE LINK CONTROL--+-| file-link-options |-+-' '-MODE DB2OPTIONS-------' file-link-options |---*--INTEGRITY----ALL----*--READ PERMISSION--+-FS-+-----------> '-DB-' >----*--WRITE PERMISSION--+-FS------+--*--RECOVERY--+-NO--+-----> '-BLOCKED-' '-YES-' >----*--ON UNLINK--+-RESTORE-+---*------------------------------| '-DELETE--' column-default-spec |---+-| default-clause |-----------------------------------------------+-> '-GENERATED--+-ALWAYS-----+---AS--+-| identity-clause |----------+-' '-BY DEFAULT-' '-(--generation-expression--)--' >---------------------------------------------------------------| identity-clause |---IDENTITY--+-------------------------------------------------------+-> | .-,-----------------------------------------. | | V .-1----------------. | | '-(------+-START WITH--+-numeric-constant-+---+--+---)--' | .-1----------------. | +-INCREMENT BY--+-numeric-constant-+-+ | .-CACHE--20----------------. | '-+-NO CACHE-----------------+-------' '-CACHE--integer-constant--' >---------------------------------------------------------------|
references-clause |--REFERENCES--table-name----+----------------------------+-----> | .-,--------------. | | V | | '-(-----column-name---+---)--' >-----| rule-clause |-------------------------------------------| rule-clause .-ON DELETE NO ACTION-----. .-ON UPDATE NO ACTION--. |--*--+-------------------------+---*--+----------------------+---*--> '-ON DELETE--+-RESTRICT-+-' '-ON UPDATE RESTRICT---' +-CASCADE--+ '-SET NULL-' >---------------------------------------------------------------| default-clause .-WITH-. |---+------+--DEFAULT--+---------------------+------------------| '-| default-values |--' unique-constraint |---+------------------------------+---+-UNIQUE------+----------> '-CONSTRAINT--constraint-name--' '-PRIMARY KEY-' .-,--------------. V | >----(-----column-name---+---)----------------------------------| referential-constraint |---+-----------------------------------+--FOREIGN KEY----------> | (1) | '-CONSTRAINT--constraint-name-------' .-,--------------. V | >----(-----column-name---+---)----| references-clause |---------| check-constraint |--+------------------------------+-----------------------------> '-CONSTRAINT--constraint-name--' >----CHECK--(--check-condition--)-------------------------------| OID-column-definition |---REF IS--OID-column-name--USER GENERATED---------------------| with-options |---column-name--WITH OPTIONS---| column-options |--------------|
注:
説明
UNDER が指定されていない場合には、 オブジェクト識別列を指定する必要があります (OID-column-definition を参照)。 このオブジェクト識別列は、その表の最初の列になります。 オブジェクト ID 列の後に、type-name1 の属性に基づく列が続きます。
表の列には、スーパー表のオブジェクト識別子列が含まれています。 この列のタイプは、REF(type-name1) に変更されており、 type-name1 の属性に基づく列が続きます (ここでいうタイプには、 スーパータイプの属性も含まれていることを念頭に置いてください)。 属性名は OID 列名と同じものにすることはできません (SQLSTATE 42711)。
表スペース、データ取り込みなど他の表オプションは、 最初のうちログされません。また、区分化キーを指定することはできません。 これらのオプションはスーパー表から継承されます (SQLSTATE 42613)。
全選択の結果表に、無名列の重複列名がある場合には、 列名のリストを指定する必要があります (SQLSTATE 42908)。 無名列とは、定数、関数、式、またはセット演算から派生した列で、 選択リストの AS 文節によって名前が指定されていない列を指します。
各選択リスト要素には名前が必要です (式には AS 文節を使用します。 詳細は、SELECT 文節を参照してください)。 指定された summary-table-options (要約表オプション) は、 要約表の属性を定義します。 選択されたオプションは、次のような全選択の内容も定義します。
DEFINITION ONLY が指定されている場合、 タイプ付き表またはタイプ付き視点を参照しない有効な全選択を指定することができます。
REFRESH DEFERRED または REFRESH IMMEDIATE が指定されていると、 全選択で次のものを指定できません (SQLSTATE 428EC)。
REFRESH IMMEDIATE は、以下の場合に指定されます。
表の列は、全選択の結果である列の定義に基づいて定義されます。 全選択によって FROM 文節の 1 つの表が参照される場合、 その表の列である選択リスト項目は、参照される表の列名、 データ・タイプ、そしてヌル可能特性を使って定義されます。
LIKE は、n 列の暗黙的な定義で使います。n は、 指定した表、視点またはニックネームにおける列の数です。
copy-attributes 文節に基づいて、 列のデフォルトと識別列属性を組み込んだり除外したりすることができます。 さらにこの暗黙的な定義には、指定した表、視点、 またはニックネームの他の属性は含まれません。 したがって、新しい表には固有制約、外部キー制約、トリガー、または索引はありません。 表は IN 文節で暗黙的にまたは明示的に指定した表スペースの中で作成されます。 また、任意指定の他の文節を指定した場合に限り、この表にその任意指定の文節が含まれます。
LIKE table-name が指定され、 しかも table-name が基礎表または一時表を指定する場合、 INCLUDING COLUMN DEFAULTS がデフォルトになります。
この文節がデフォルトです。ただし、LIKE table-name が指定され、 しかも table-name が基礎表または一時表を指定する場合を除きます。
表には、以下のものを指定できます。
また、以下を指定することもできます。
精度と位取りが指定されない場合、5,0 のデフォルト値が使用されます。 NUMERIC および NUM は、 DECIMAL および DEC の同義語として使用可能です。
長さは、1 〜 2,147,483,647 バイトの範囲で指定できます。
integer (整数) だけを指定した場合は、それが最大長になります。
integer K (大文字または小文字) を指定した場合、 最大長は integer の 1,024 倍になります。 integer の最大値は 2,097,152 です。
integer M を指定した場合、 最大長は integer の 1,048,576 倍になります。 integer の最大値は 2,048 です。
integer G を指定した場合、 最大長は integer の 1,073,741,824 倍になります。 integer の最大値は 2 です。
1 ギガバイトを超える BLOB ストリングを作成するには、 NOT LOGGED オプションを指定しなければなりません。
integer と K、M、または G の間には、任意の数のスペースを使用できます。 スペースなしでも構いません。 たとえば、次の例はすべて有効です。
BLOB(50K) BLOB(50 K) BLOB (50 K)
integer K | M | G の意味は、BLOB の場合と同じです。
1 ギガバイトを超える CLOB ストリングを作成するには、 NOT LOGGED オプションを指定しなければなりません。
integer K | M | G の意味は、BLOB の場合に類似しています。 指定する数値が 2 バイト文字 1 個を 1 文字と数えた値であることと、 最大サイズが 2 バイト文字 1,073,741,823 個であるという点が違います。
1 ギガバイトを超える DBCLOB ストリングを作成するには、 NOT LOGGED オプションを指定しなければなりません。
表内の列は "アンカー値" で構成されます。 このアンカー値には、外部データだけではなく、 任意コメントへのリンクを確立したり保持したりするための参照情報が含まれています。
DATALINK 列の長さは 200 バイトです。 integer を指定する場合、200 でなければなりません。 長さの指定がない場合、長さは 200 バイトであると想定されます。
DATALINK 値とは、一そろいの組み込みスカラー関数を持つカプセル化された値です。 DATALINK 値は DLVALUE という名前の関数が作成します。 DATALINK 値から属性を抽出するために、以下の関数を使用することができます。
DATALINK 列には、以下の制限事項があります。
特殊タイプを使用して列を定義する場合、 その列のデータ・タイプはその特殊タイプになります。 列の長さと位取りは、それぞれ特殊タイプのソース・タイプの長さと位取りになります。
特殊タイプを使用して定義された列が参照制約の外部キーである場合、 基本キーの対応する列のデータ・タイプは、同じ特殊タイプでなければなりません。
構造タイプを使用して列を定義する場合、 その列の静的データ・タイプはその構造タイプになります。 その列には、 structured-type-name のサブタイプである動的タイプをもつ値を組み込むことができます。
構造タイプを使用して定義された列を、基本キー、固有制約、外部キー、索引キー、 または区分化キー内で使うことはできません (SQLSTATE 42962)。
列が、構造タイプを使用して定義されていて、 ネストのいずれかのレベルで参照タイプ属性をもっている場合、 その参照タイプ属性の効力範囲は解除されます。 そのような属性を参照操作で使用するには、 CAST 指定を使って SCOPE を明示的に指定する必要があります。
タイプ DATALINK の属性をもつ構造タイプか、 または DATALINK をソースとして派生された特殊タイプを使って列が定義されている場合、 その列はヌルにしかできません。 このようなタイプの場合にコンストラクター関数を使うと、 エラーが戻される (SQLSTATE 428ED) ので、このタイプのインスタンスは列に挿入できません。
NOT NULL を指定しない場合、列にヌル値を含めることができます。 また、そのデフォルト値はヌル値、 または WITH DEFAULT 文節で指定される値のいずれかになります。
1 ギガバイトを超える LOB はログ記録することができず (SQLSTATE 42993)、 10 メガバイトを超える LOB はログ記録されない可能性があります。
NOT LOGGED は、コミットやロールバックの操作には影響しません。 つまり、トランザクションがロールバックされても、 LOB の値がログ記録されるか否かに関係なくデータベースの整合性は保持されます。 ログ記録しないなら、ロールフォワード操作中、 バックアップまたはロード操作の後の LOB データは、 ロールフォワード操作中にログ・レコードを再生させることになった LOB 値をゼロによって置換したものになります。 破損回復の過程で、コミットされた変更とロールバックされた変更すべてに、 予期された結果が反映されます。 LOB 列をログ記録しない場合に起こることについては、管理の手引き を参照してください。
WRITE PERMISSION FS が使用されているため、ON UNLINK は適用できません。
参照解除演算子の左オペランド、または DEREF 関数の引き数として使用する列には、 すべて効力範囲を指定しなければなりません。 ターゲット表が定義されるように、 後続する ALTER TABLE ステートメントまで参照タイプ列の指定を遅らせることができます (通常は、 相互参照表の場合に適用する)。
この文節が省略されると、 表に定義されている既存の制約の識別子内で固有な 18 文字の識別子が 76 システムによって生成されます。
PRIMARY KEY 制約または UNIQUE 制約とともに使用した場合、 この constraint-name は、 制約をサポートするために作成される索引の名前として使用されます。
基本キーはスーパー表から継承されたものなので、表が副表である場合 (SQLSTATE 429B3)、 基本キーを指定することはできません。
この後の unique-constraint の説明の中の PRIMARY KEY を参照してください。
固有制約はスーパー表から継承されたものなので、表が副表である場合 (SQLSTATE 429B3)、 固有制約を指定することはできません。
この後の unique-constraint の説明の中の UNIQUE を参照してください。
後述の referential-constraint の references-clause の項を参照してください。
構造タイプ列のデフォルトの INLINE LENGTH は、 このタイプのインライン長になります (明示的に指定するか、 または CREATE TYPE ステートメント内のデフォルトとして)。 構造タイプの INLINE LENGTH が 292 未満の場合、列の INLINE LENGTH には値 292 が使われます。
注: | サブタイプのインライン長は、デフォルトのインライン長には含まれませんが、 それは、CREATE TABLE 時に明示的に INLINE LENGTH を指定して、 現在および将来のサブタイプに対処できるようにしておかないと、 サブタイプのインスタンスはインラインに適合しないことがあることを意味します。 |
明示的な INLINE LENGTH の値は少なくとも 292 でなければならず、 32672 を超えてはなりません (SQLSTATE 54010)。
列を DATALINK として定義する場合、デフォルト値は指定できません (SQLSTATE 42613)。 可能なデフォルト値は NULL だけです。
列がタイプ付き表の列に基づいている場合、 デフォルト値の定義時には特定のデフォルト値を指定しなければなりません。 タイプ付き表のオブジェクト識別子の列には、 デフォルト値を指定することはできません (SQLSTATE 42997)。
列が特殊タイプを使用して定義される場合、列のデフォルト値は、 特殊タイプにキャストされたソース・データ・タイプのデフォルト値になります。
構造タイプを使用して列を定義する場合は、 default-clause を指定できません (SQLSTATE 42842)。
column-definition から DEFAULT を省略すると、 その列のデフォルト値としてヌル値が使用されます。 そのような列を NOT NULL と定義すると、その列には有効なデフォルトはなくなります。
指定した値が無効な場合、エラー (SQLSTATE 42894) が発生します。
明示的には指示されませんが、値の固有性を確保するには、 固有の 1 列の索引を生成列で定義しなければなりません。
識別列は暗黙で NOT NULL になります。
この値が負の場合、この識別列の値の順序は降順になります。 この値が正の場合、この識別列の値の順序は昇順になります。 デフォルトは 1 です。
識別列で新しい値が必要になった場合に、 キャッシュの中のものを使えないときの値の割り振り作業には、ログ記録される間の待機も含まれます。 ただし、識別列で新しい値が必要になった場合に、 キャッシュの中に未使用の値があるときは、ログ記録を実行しなければ、 その識別値の割り振りを迅速に行うことができます。
データベースの非活動化時には、それが通常操作 79 またはシステム障害のどちらに起因するものであっても、 コミット済みのステートメントでまだ使われていないキャッシュされたシーケンス値はすべて失われます。 データベースの活動解除が起きたら失われる可能性のある識別列値の最大数は、 CACHE オプションに指定された値になります。
最小値は 2、最大値は 32767 です (SQLSTATE 42815)。 デフォルトは CACHE 20 です。
このオプションを指定すると、識別列の値はキャッシュに保管されません。 その場合、新たに識別値を要求するたびにログ記録がとられることになります。
列のデータ・タイプは generation-expression の結果データ・タイプに基づいています。 CAST 指定を使って特定のデータ・タイプを強制的に使用し、 効力範囲を設けることができます (参照タイプの場合のみ)。 data-type を指定すると、 言語要素で説明されている割り当て規則に従って、値が列に割り当てられます。 NOT NULL 列オプションを使わない限り、生成された列は暗黙でヌル可能とみなされます。 生成される列のデータ・タイプは、同等性を定義されているものでなければなりません。 ただしこの場合、LONG VARCHAR、LONG VARGRAPHIC、LOB データ・タイプ、DATALINK、 構造タイプ、および、これらのタイプに基づいた特殊タイプの列を除きます (SQLSTATE 42962)。
タイプ定義 (CREATE TYPE) の一部としてオプションが既に指定されている場合には、 ここで指定されているオプションは CREATE TYPE のオプションを指定変更します。
表がタイプ付き表である場合、 このオプションはサポートされません (SQLSTATE 428DH または 42HDR)。
カタログ区分以外の区分にデータが置かれるように表が定義されている場合 (複数区分のノードグループ、 またはカタログ区分以外の区分を持つノードグループ)、 このオプションはサポートされません (SQLSTATE 42997)。
表のスキーマ名 (暗黙または明示名) が 18 バイトより長い場合、 このオプションはサポートされません (SQLSTATE 42997)。
複製の使用法の詳細については、 管理の手引き および レプリケーションの手引きおよび解説書 を参照してください。
IF table space IBMDEFAULTGROUP over which the user has USE privilege exists with sufficient page size THEN choose it ELSE IF a table space over which the user has USE privilege exists with sufficient page size (複数表スペース修飾の場合は下記を参照) THEN choose it ELSE issue an error (SQLSTATE 42727).
ELSE IF 条件で複数の表スペースが指定されている場合、 ステートメントの許可 ID がもつ USE 特権の対象の最小限必要なページ・サイズをもつ表スペースを選択します。 複数の表スペースがそれにあてはまる場合、 以下のどれに USE 特権が付与されているかに応じて優先順位が決められます。
それでも複数の表スペースがそれにあてはまる場合は、 最終選択はデータベース・マネージャーによって行われます。
表スペースの決定は、以下の時点で変更することができます。
十分な表のページ・サイズは、行のバイト・カウントか列の数のいずれかによって決まります。 行サイズを参照。
表の索引を入れる表スペースの指定は、 その表の作成時にのみ行うことができる点に注意してください。 索引用の表スペースに対する USE 特権の検査は、表の作成時にしか行われません。 その後の索引の作成時に CREATE INDEX ステートメントの許可 ID が、 表スペースに対する USE 特権をもつことがデータベース・マネージャーによって要求されることはありません。
表の長形式列と LOB 列を入れる表スペースの指定は、 その表の作成時にのみ行うことができる点に注意してください。 長形式列と LOB 列用の表スペースに対する USE 特権の検査は、表の作成時にしか行われません。 その後の長形式列と LOB 列の追加時に ALTER TABLE ステートメントの許可 ID が、 表スペースに対する USE 特権をもつことがデータベース・マネージャーで要求されることはありません。
この文節の指定がなく、この表が複数区分のノードグループに存在する場合、 その区分化キーは次のように定義されます。
デフォルトの区分化キーの要件を満たす列が存在しない場合、 表は区分化キーなしで作成されます。 このような表は、単一区分のノードグループに対して定義された表スペースでのみ許されます。
単一区分のノードグループに対して定義された表スペースの表の場合、 長形式以外の一連の列はいずれも区分化キーの定義に使用することができます。 このパラメーターの指定がない場合、区分化キーは作成されません。
区分化キーに関する制約事項については、規則を参照してください。
カタログの変更と、記憶域に関連する情報は、 以後の作業単位で表に対して行われた操作と同様にすべてログ記録されます。
NOT LOGGED INITIALLY 属性を指定した親を参照する表に、 外部キー制約を定義することはできません。 この文節は、副表を作成する際には指定できません (SQLSTATE 42613)。
注: | 保管点へのロールバック要求を、 NOT LOGGED INITIALLY 表の作成と同じ作業単位内で発行することはできません。 発行するとエラーが生じ (SQLSTATE 40506)、その作業単位全体がロールバックされます。 |
指定する列の数は 16 を超えてはならず、 保管されるそれらの長さの合計は 1024 を超えてはなりません (保管される長さの詳細は、 Byte Countsを参照)。 それぞれの列の長さは、どれも 255 バイトを超えてはなりません。 その長さはデータにのみ関するものであり、 出現してもヌル・バイトによって影響を受けることはありません。 列がヌル可能かどうかに関係なく、列の最大データ長は 255 バイトです。 列の長さ属性が 255 バイト以内に収まる場合でも、 LOB、LONG VARCHAR、LONG VARGRAPHIC、DATALINK、 これらのタイプのうちのいずれかに基づく特殊タイプ、または構造タイプは、 固有キーの一部として使用できません (SQLSTATE 42962)。
固有キーの一連の列は、 基本キーまたは別の固有キーの一連の列と同じであってはなりません (SQLSTATE 01543)。81
固有制約はスーパー表から継承されたものなので、表が副表である場合 (SQLSTATE 429B3)、 固有制約を指定することはできません。
カタログに記録されている表の記述には、固有キーとその固有索引が含まれます。 固有索引は、それぞれの列について昇順に指定された順序で、列に対して自動的に作成されます。
索引の名前は、表の作成時にスキーマに存在する既存の索引と競合しない場合、 constraint-name (制約名) と同じになります。 索引名が競合する場合は、 名前は SQL の後に文字のタイム・スタンプ (yymmddhhmmssxxx) が続き、 スキーマ名として SYSIBM を伴う名前になります。
指定する列の数は 16 を超えてはならず、 保管されるそれらの長さの合計は 1024 を超えてはなりません (保管される長さの詳細は、 Byte Countsを参照)。 それぞれの列の長さは、どれも 255 バイトを超えてはなりません。 その長さはデータにのみ関するものであり、 出現してもヌル・バイトによって影響を受けることはありません。 列がヌル可能かどうかに関係なく、列の最大データ長は 255 バイトです。 列の長さ属性が 255 バイト以内に収まる場合でも、 LOB、LONG VARCHAR、LONG VARGRAPHIC、DATALINK、 これらのタイプのうちのいずれかに基づく特殊タイプ、または構造タイプは、 基本キーの一部として使用できません (SQLSTATE 42962)。
基本キーの一連の列は、固有キーの一連の列と同じであってはなりません (SQLSTATE 01543)。81
1 つの表には、基本キーを 1 つだけ定義することができます。
基本キーはスーパー表から継承されたものなので、表が副表である場合 (SQLSTATE 429B3)、 基本キーを指定することはできません。
カタログに記録されている表の記述には、基本キーとその 1 次索引が含まれます。 固有索引は、それぞれの列について昇順に指定された順序で、列に対して自動的に作成されます。
索引の名前は、表の作成時にスキーマに存在する既存の索引と競合しない場合、 constraint-name (制約名) と同じになります。 索引名が競合する場合は、 名前は SQL の後に文字のタイム・スタンプ (yymmddhhmmssxxx) が続き、 スキーマ名として SYSIBM を伴う名前になります。
表に区分化キーがある場合、 unique-constraint (固有制約) の列は 区分化キーの列のスーパーセットである必要があります。 列の順序は重要ではありません。
T1 を、ステートメントの対象となる表であると想定します。 参照制約の外部キーは、指定された列で構成されます。 列名リストの各名前は、T1 の列を指定していなければならず、 同じ列を複数回指定することはできません。 指定する列の数は 16 を超えてはならず、 保管されるそれらの長さの合計は 1024 を超えてはなりません (保管される長さの詳細は、 Byte Countsを参照)。 LOB、LONG VARCHAR、LONG VARGRAPHIC、DATALINK、 これらのタイプのうちのいずれかに基づく特殊タイプ、または構造タイプの列を、 外部キーの一部として使用することはできません (SQLSTATE 42962)。 外部キーの列の数は、親キーの列の数と同じでなければならず、 対応する列のデータ・タイプは互換性があることが必要です (SQLSTATE 42830)。 2 つの列の記述は、それらの列が互換性のあるデータ・タイプ (両方の列が数字、 文字ストリング、グラフィック、日付 / 時間であるか、 または同じ特殊タイプ) であれば互換性があります。
参照制約の外部キー、親キー、および親表が、 以前に指定した参照制約の外部キー、親キー、および親表と同じである場合、 参照制約は重複します。 重複した参照制約は無視され、警告が出されます (SQLSTATE 01543)。
以下の説明で、T2 は指定された親表を、T1 は作成している表 82 を指しています (T1 と T2 は同じ表にできます)。
指定された外部キーの列の数は、T2 の親キーと同じ数でなければなりません。また、 外部キーの n 番目の列の記述は、 その親キーの n 番目の列の記述と互換性がなければなりません。 この規則において、日付 / 時刻の列はストリング列と互換性があるとは見なされません。
列名のリストは、 親キーまたは T2 に存在する固有制約の一連の列と一致している (順序は任意) 必要があります (SQLSTATE 42890)。 列名のリストの指定がない場合、T2 に親キーがある必要があります (SQLSTATE 42888)。 列名リストを省略すると、指定されているとおりの順序でその基本キーの列が暗黙に指定されます。
FOREIGN KEY 文節で指定される参照制約は、 T2 が親であり、T1 が従属である関係を定義します。
削除規則は、T2 の行が DELETE または伝搬による削除操作の対象であり、 その行の従属行が T1 にある場合に、適用されます。 p は、そのような T2 の行を表すと想定します。
SET NULL は、外部キーの列にヌル可能な列がない限り指定してはなりません。 この文節を省略すると、暗黙に ON DELETE NO ACTION が指定されます。
複数の表の関係するサイクルでは、そのサイクル内の削除規則がすべて CASCADE でない限り、 表がそれ自体に連結削除されていてはなりません。 したがって、新しい関係がサイクルを形成し、T2 がすでに T1 に連結削除されている場合には、 削除規則が CASCADE で、しかもそのサイクルの他の削除規則がすべて CASCADE であるのでない限り、 制約を定義することはできません。
T1 が複数のパスによって T2 に連結削除されている場合、 それらのパスの全体または一部を構成する関係のうち T1 が従属であるものの削除規則は同じでなければならず、 SET NULL にすることはできません。 NO ACTION アクションと RESTRICT アクションの処理は同じです。 したがって、削除規則が r の関係で T1 が T3 の従属表であるとすると、 r が SET NULL のときに、 次の条件のいずれかが存在するなら、参照制約を定義することはできません。
r が SET NULL 以外の場合、参照制約は定義できますが、 FOREIGN KEY 文節で暗黙的または明示的に指定される削除規則は r と 同一でなければなりません。
親表または従属表がタイプ付き表階層のメンバーである参照制約に対する上記の規則の適用の場合、 それぞれの階層内の任意の表に対して適用されるすべての参照制約が考慮に入れられます。
NO ACTION と RESTRICT の差異については、 注 の CREATE TABLE を参照してください。
列定義 の一部として検査制約を指定する場合、 その同じ列に対してのみ列参照を行うことができます。 表定義の一部として指定された検査制約には、 それ以前に CREATE TABLE ステートメントで定義されている列を指定する列参照を含めることができます。 検査制約の矛盾、重複条件、または同等条件については検査されません。 したがって、矛盾した検査制約や冗長な検査制約が定義可能であるため、 実行時にエラーになる可能性があります。
検査条件 "IS NOT NULL" も指定できますが、 列の NOT NULL 属性を使用することによって直接的にヌル値可を指定するようにしてください。 たとえば、salary が NULL に設定された場合に、 CHECK (salary + bonus > 30000) は受け入れられます。 これは、CHECK 制約は満たされるか未知かのどちらかでなければならず、 この場合 salary は未知であるためです。 一方、給与 (salary) が NULL に設定されている場合に、 CHECK (salary IS NOT NULL) は偽となり、制約違反とみなされます。
検査制約は、表に対して行の挿入または更新が行われる時点で適用されます。 表で定義される検査制約は、その表の副表すべてに自動的に適用されます。
表 22. 有効な DATALINK ファイル制御オプションの組み合わせ
INTEGRITY | READ PERMISSION | WRITE PERMISSION | RECOVERY | ON UNLINK |
---|---|---|---|---|
ALL | FS | FS | NO | 該当なし |
ALL | FS | BLOCKED | NO | RESTORE |
ALL | FS | BLOCKED | YES | RESTORE |
ALL | DB | BLOCKED | NO | RESTORE |
ALL | DB | BLOCKED | NO | DELETE |
ALL | DB | BLOCKED | YES | RESTORE |
ALL | DB | BLOCKED | YES | DELETE |
以下の規則は、区分データベースに対してのみ適用されます。
Table T1 is a parent of table T3, delete rule as noted below Table T2 is a parent of table T3, delete rule CASCADE CREATE VIEW V1 AS SELECT * FROM T1 UNION ALL SELECT * FROM T2 DELETE FROM V1
表 T1 が RESTRICT の削除規則を伴う表 T3 の親である場合に、T3 に T1 の親キーの子行があると、 制約違反 (SQLSTATE 23001) になります。
表 T1 が表 T3 の親で、T3 の削除規則が NO ACTION である場合、 T1 からの削除に対して NO ACTION 削除規則が適用される前に T2 から行を削除すると、 削除規則 CASCADE によって、その子行が削除される場合があります。 T2 からの削除で、T3 の T1 の親キーの子行すべてが削除されたわけではない場合は、 制約違反 (SQLSTATE 23504) になります。
戻される SQLSTATE は、 削除規則または更新規則が RESTRICT か NO ACTION かによって異なります。
表を他の表と頻繁に結合する場合は、 結合する列を両方の表の区分化キーにすることを考慮してください。
実際には、作動不能要約表とは、要約表定義が間違って除去された要約表です。 たとえば、別名が除去されると、 その別名を使用して定義されている要約表すべてが作動不能になります。 要約表に従属するパッケージはすべて無効になります。
作動不能要約表を明示的に作成しなおすか、あるいは除去する時点まで、 その作動不能要約表を使用するステートメントのコンパイルはできません (SQLSTATE 51024)。 ただし、CREATE ALIAS、CREATE TABLE、DROP TABLE、 および COMMENT ON TABLE の各ステートメントは例外です。 作動不能要約表が明示的に削除されるまで、その修飾名を使って 別の視点、基礎表、または別名を作成することはできなくなります (SQLSTATE 42710)。
作動不能要約表は、 作動不能要約表の定義テキストを使用して CREATE TABLE ステートメントを発行することにより、 再作成することができます。 この要約表照会テキストは、SYSCAT.VIEWS カタログの TEXT 列に保管されます。 作動不能要約表を再作成する場合は、 他のユーザーでその要約表に対して必要となる特権すべてを明示的に付与する必要があります。 これは、要約表に作動不能のマークが付いていると、 要約表のすべての許可レコードが削除されるためです。 作動不能要約表を再作成するために、それを明示的に削除する必要はありません。 要約表を定義する CREATE TABLE ステートメントに、 動作不能要約表と同じ table-name を指定して発行すると、 動作不能要約表は置き換えられ、 CREATE TABLE ステートメントは警告を戻します (SQLSTATE 01595)。
作動不能要約表であることは、SYSCAT.VIEWS カタログ視点の VALID 列の X、 また SYSCAT.TABLES カタログ視点の STATUS 列が X であることによって示されます。
表 23. 各表スペースのページ・サイズの列数および行サイズの制限
ページ・サイズ | 行サイズの制限 | 列数の制限 |
---|---|---|
4K | 4 005 | 500 |
8K | 8 101 | 1 012 |
16K | 16 293 | 1 012 |
32K | 32 677 | 1 012 |
表の実際の列数については、次の公式によってさらに制限されます。
構造タイプに基づいて表が作成されると、副表が定義されているか否かにかかわらず、 副表の行を識別するために 4 バイトのオーバーヘッドが確保されます。 さらに、追加される副表列は、ヌル値不可と定義されたとしても、 バイト・カウント用にヌル値可能なものと見なされる必要があります。
最大 LOB 長 LOB 記述子のサイズ 1 024 72 8 192 96 65 536 120 524 000 144 4 190 000 168 134 000 000 200 536 000 000 224 1 070 000 000 256 1 470 000 000 280 2 147 483 647 316
例
例 1: DEPARTX 表スペースに表 TDEPT を作成します。 DEPTNO、 DEPTNAME、MGRNO、および ADMRDEPT は列の名前です。 CHAR は、列が文字データを含むことを意味しています。 NOT NULL は、列にヌル値を含めることができないことを示します。 VARCHAR は、列のデータが可変長文字データであることを意味します。 基本キーは、列 DEPTNO で構成されます。
CREATE TABLE TDEPT (DEPTNO CHAR(3) NOT NULL, DEPTNAME VARCHAR (36) NOT NULL, MGRNO CHAR(6), ADMRDEPT CHAR(3) NOT NULL, PRIMARY KEY(DEPTNO)) IN DEPARTX
例 2: SCHED 表スペースに表 PROJ を作成します。 PROJNO、 PROJNAME、 DEPTNO、 RESPEMP、 PRSTAFF、 PRSTDATE、 PRENDATE、 および MAJPROJ は列の名前です。 CHAR は、列が文字データを含むことを意味しています。 DECIMAL は、列のデータがパック 10 進数データであることを意味します。 5,2 の 5 は 10 進数の桁数、2 は小数点以下の桁数を示します。 NOT NULL は、列にヌル値を含めることができないことを示します。 VARCHAR は、列のデータが可変長文字データであることを意味します。 DATE は、列のデータが 3 つの部分からなる形式 (年、月、日) の日付情報であることを示しています。
CREATE TABLE PROJ (PROJNO CHAR(6) NOT NULL, PROJNAME VARCHAR(24) NOT NULL, DEPTNO CHAR(3) NOT NULL, RESPEMP CHAR(6) NOT NULL, PRSTAFF DECIMAL(5,2) , PRSTDATE DATE , PRENDATE DATE , MAJPROJ CHAR(6) NOT NULL) IN SCHED
例 3: 不明の給与はすべて 0 とみなされる EMPLOYEE_SALARY という名前の表を作成します。 表スペースが指定されていないので、 IN tablespace-name1 文節について記述された規則に基づいてシステムが選択した表スペースに、 表が作成されます。
CREATE TABLE EMPLOYEE_SALARY (DEPTNO CHAR(3) NOT NULL, DEPTNAME VARCHAR (36) NOT NULL, EMPNO CHAR(6) NOT NULL, SALARY DECIMAL(9,2) NOT NULL WITH DEFAULT)
例 4: 給与 (SALARY) と距離 (MILES) の合計用の特殊タイプを作成し、 デフォルト表スペースに作成される表の列として使用します。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターが JOHNDOE で、 CURRENT PATH がデフォルト値であると想定します ("SYSIBM","SYSFUN","JOHNDOE")。
SALARY の値の指定がない場合には、それを 0 に設定します。 また、LIVING_DIST の値の指定がない場合には、それを 1 マイルに設定します。
CREATE DISTINCT TYPE JOHNDOE.T_SALARY AS INTEGER WITH COMPARISONS CREATE DISTINCT TYPE JOHNDOE.MILES AS FLOAT WITH COMPARISONS CREATE TABLE EMPLOYEE (ID INTEGER NOT NULL, NAME CHAR (30), SALARY T_SALARY NOT NULL WITH DEFAULT, LIVING_DIST MILES DEFAULT MILES(1) )
例 5: 画像 (IMAGE) と音声 (AUDIO) 用の特殊タイプを作成し、表の列として使用します。 表スペースが指定されていないので、 IN tablespace-name1 文節に関して説明した規則に基づいてシステムが選択した表スペースに、 表が作成されます。 CURRENT PATH はデフォルト値であると想定します。
CREATE DISTINCT TYPE IMAGE AS BLOB (10M) CREATE DISTINCT TYPE AUDIO AS BLOB (1G) CREATE TABLE PERSON (SSN INTEGER NOT NULL, NAME CHAR (30), VOICE AUDIO, PHOTO IMAGE)
例 6: HUMRES 表スペースに表 EMPLOYEE を作成します。 表には、次のような制約を定義します。
注: | 検査制約に含まれる列がヌル値可能である場合、
それらも NULL になる可能性があります。
CREATE TABLE EMPLOYEE (ID SMALLINT NOT NULL, NAME VARCHAR(9), DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100), JOB CHAR(5) CHECK (JOB IN ('Sales','Mgr','Clerk')), HIREDATE DATE, SALARY DECIMAL(7,2), COMM DECIMAL(7,2), PRIMARY KEY (ID), CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) > 1986 OR SALARY > 40500) ) IN HUMRES |
例 7: PAYROLL 表スペースに全体が含まれる表を作成します。
CREATE TABLE EMPLOYEE ..... IN PAYROLL
例 8: データ部分が ACCOUNTING にあり、索引部分が ACCOUNT_IDX にある表を作成します。
CREATE TABLE SALARY..... IN ACCOUNTING INDEX IN ACCOUNT_IDX
例 9: 表を作成して、SQL の変更内容をデフォルトのフォーマットでログ記録します。
CREATE TABLE SALARY1 .....
または
CREATE TABLE SALARY1 ..... DATA CAPTURE NONE
例 10: 表を作成して、SQL の変更内容を拡張フォーマットでログ記録します。
CREATE TABLE SALARY2 ..... DATA CAPTURE CHANGES
例 11: SCHED 表スペースに表 EMP_ACT を作成します。 EMPNO、 PROJNO、ACTNO、EMPTIME、EMSTDATE、および EMENDATE は列の名前です。 表には、次のような制約を定義します。
CREATE TABLE EMP_ACT (EMPNO CHAR(6) NOT NULL, PROJNO CHAR(6) NOT NULL, ACTNO SMALLINT NOT NULL, EMPTIME DECIMAL(5,2), EMSTDATE DATE, EMENDATE DATE, CONSTRAINT EMP_ACT_UNIQ UNIQUE (EMPNO,PROJNO,ACTNO), CONSTRAINT FK_ACT_PROJ FOREIGN KEY (PROJNO) REFERENCES PROJECT (PROJNO) ON DELETE CASCADE ) IN SCHED
固有制約を課すために、 EMP_ACT_UNIQ という名前の固有索引が同じスキーマ内に自動的に作成されます。
例 12: アイス・ホッケーの栄誉の殿堂に入る、有名なゴールについての情報を保持する表を作成します。 この表には、ゴールをきめたホッケー選手の名前、 ゴールをきめられたゴールキーパーの名前、日付と場所、 ゴールについての説明文などの情報がリストされます。 さらに、可能ならば、その試合についての新聞記事やゴールのスチール写真と動画の保管先を示します。 新聞記事は削除したり、名前を変更したりできないようにリンクで接続されますが、 この間、既存の表示アプリケーションや更新アプリケーションは操作を続ける必要があります。 スチール写真やムービーはリンクされてからアクセスできるようになりますが、 この操作はすべて DB2 によって制御されます。 リンクが解除されると、スチール写真は回復されて元の所有者に戻されます。 一方、ムービー写真は回復されず、リンクが解除された時点で削除されます。 説明列と 3 つの DATALINK 列はヌル値可能です。
CREATE TABLE HOCKEY_GOALS ( BY_PLAYER VARCHAR(30) NOT NULL, BY_TEAM VARCHAR(30) NOT NULL, AGAINST_PLAYER VARCHAR(30) NOT NULL, AGAINST_TEAM VARCHAR(30) NOT NULL, DATE_OF_GOAL DATE NOT NULL, DESCRIPTION CLOB(5000), ARTICLES DATALINK LINKTYPE URL FILE LINK CONTROL MODE DB2OPTIONS, SNAPSHOT DATALINK LINKTYPE URL FILE LINK CONTROL INTEGRITY ALL READ PERMISSION DB WRITE PERMISSION BLOCKED RECOVERY YES ON UNLINK RESTORE, MOVIE DATALINK LINKTYPE URL FILE LINK CONTROL INTEGRITY ALL READ PERMISSION DB WRITE PERMISSION BLOCKED RECOVERY NO ON UNLINK DELETE )
例 13: EMPLOYEE 表に例外表が必要であるとします。 これは、以下のステートメントを使用して作成できます。
CREATE TABLE EXCEPTION_EMPLOYEE AS (SELECT EMPLOYEE.*, CURRENT TIMESTAMP AS TIMESTAMP, CAST ('' AS CLOB(32K)) AS MSG FROM EMPLOYEE ) DEFINITION ONLY
例 14: 示された属性を持つ次のような表スペースがあるとします。
TBSPACE PAGESIZE USER USERAUTH ------------------ ----------- ------ -------- DEPT4K 4096 BOBBY Y PUBLIC4K 4096 PUBLIC Y DEPT8K 8192 BOBBY Y DEPT8K 8192 RICK Y PUBLIC8K 8192 PUBLIC Y
CREATE TABLE DOCUMENTS (SUMMARY VARCHAR(1000), REPORT VARCHAR(2000))
CREATE TABLE CURRICULUM (SUMMARY VARCHAR(1000), REPORT VARCHAR(2000), EXERCISES VARCHAR(1500))
例 15: 構造タイプ EMP を使って定義された LEAD 列をもつ表を作成します。 LEAD 列に 300 バイトの INLINE LENGTH を指定します。 これは、300 バイト以内におさまらない LEAD のインスタンスをすべて、 その表以外に保管すること (LOB 値の処理方法と同様に基礎表とは別個に) を指示します。
CREATE TABLE PROJECTS (PID INTEGER, LEAD EMP INLINE LENGTH 300, STARTDATE DATE, ...)
例 16: DEPTNO、DEPTNAME、MGRNO、ADMRDEPT、 および LOCATION という名前の 5 つの列をもつ表 DEPT を作成します。 DB2 によって常に値が生成されるよう、列 DEPT を IDENTITY 列として定義することにします。 DEPT 列の値は、500 から始まり、1 ずつ増分する必要があります。
CREATE TABLE DEPT (DEPTNO SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 500, INCREMENT BY 1), DEPTNAME VARCHAR (36) NOT NULL, MGRNO CHAR(6), ADMRDEPT SMALLINT NOT NULL, LOCATION CHAR(30))