CREATE TABLE

CREATE TABLE ステートメントにより表を定義します。定義の中には、表の名前および その列の名前と属性を含めなければなりません。定義には、表の主キーなど、 表に関するその他の属性も含めることができます。

呼び出し

このステートメントは、アプリケーション・プログラム内で DB2 CLI 関数を用いて使用することができます。 また、CLP を介して出すこともできます。

構文

>>-CREATE TABLE--表名--| エレメント・リスト |--+-----------------+-><
                                               '-WITH ENCRYPTION-'
 
エレメント・リスト:
 
      .-,----------------------------------------------.
      V                                                |
|--(----+-列名--| データ・タイプ |--| 列オプション |-+-+--)-----|
        |                 .-,----.                   |
        |                 V      |                   |
        +-PRIMARY KEY--(----列名-+--)----------------+
        +-| 参照制約 |-------------------------------+
        '-CHECK--(--チェック条件--)------------------'
 
データ・タイプ:
 
|--+-+-INTEGER-+------------------+-----------------------------|
   | '-INT-----'                  |
   +-SMALLINT---------------------+
   +-DECIMAL--(--整数--,--整数--)-+
   +-CHAR--(--整数--)-------------+
   +-CHARACTER--(--整数--)--------+
   +-VARCHAR--(--整数--)----------+
   +-BLOB--(--整数--)-------------+
   +-DATE-------------------------+
   +-TIME-------------------------+
   '-TIMESTAMP--------------------'
 
列オプション:
 
   .-------------------------------------.
   V                                     |
|----+---------------------------------+-+----------------------|
     +-NOT NULL------------------------+
     +-+-PRIMARY KEY---------------+---+
     | +-REFERENCES--表名----------+   |
     | '-CHECK--(--チェック条件--)-'   |
     +-DEFAULT--+-定数---------------+-+
     |          '-日時特殊レジスター-' |
     '-GENERATED ALWAYS AS IDENTITY----'
 
参照制約:
 
                   .-,----.
                   V      |
|--FOREIGN KEY--(----列名-+--)--REFERENCES--表名----------------|
 
 

説明

表名
表の名前を指定します。 この名前は 18 バイト以内でなければなりません。 この名前は、カタログ内の 表を示すものであってはなりません。名前はモバイル・デバイスとして固有なものでなければなりません。

表名は、カタログに保管される前に大文字に変換されます。 区切り ID (二重引用符付き) を使用すると、このような変換が行われないようにすることができます。 表名にブランクまたは特殊文字が含まれる場合は、区切り ID を使用する必要があります。

表名には、2 バイト文字セットの文字も使用できます。

制約事項: ユーザー名によって作成および命名された表に対応するシステム作成のデータ・ファイルでは、 大文字と小文字は区別されません。 例えば、TB と命名された表のデータ・ファイルは、DSY_TB と命名されます。 「tb」と命名された表のデータ・ファイルもまた DSY_TB となります。 したがって、データ保全性を維持するために、文字ケースを除き、 既存の表名と同じ一連の文字を使用して表を命名しないようにすることを強くお勧めします。

WITH ENCRYPTION
暗号化されたユーザー表を作成します。 表を暗号化するには、ユーザーが認証済み、かつ接続状態になければなりません。 ユーザーは明示的に暗号化を認可されていなければなりません。 (詳細については、GRANTを参照してください。)

ユーザー表を暗号化できるのは、ユーザー表の作成時のみです。 表が作成された後では、暗号化を追加したり、除去したり (表を削除する場合は除く) することはできません。

列名
表の列の名前を指定します。 この名前は 18 バイト以内でなければなりません。 この名前は修飾できません。また、表の複数の列に同じ名前を使ってはなりません。

列名は、カタログに保管される前に大文字に変換されます。 区切り ID (二重引用符付き) を使用すると、このような変換が行われないようにすることができます。 また、列名にブランクまたは特殊文字が含まれている場合も、区切り ID を使用する必要があります。

列名には、DBCS 文字も使用できます。

データ・タイプ
以下のリスト内のいずれかのタイプです。いずれかのタイプを指定してください。
INTEGER  または  INT
4 バイトの符号付き整数の場合。範囲は 2147483647 から -2147483648 までです。
SMALLINT
2 バイトの符号付き整数の場合。範囲は -32768 から 32767 までです。
DECIMAL(精度整数, 位取り整数)
10 進数の場合。最初の整数は数値の精度、すなわち、総桁数です。この範囲は 1 から 31 までです。 2 番目の整数は数値の位取り、すなわち、小数点の右側の桁数です。 この範囲は 0 からその数値の精度までです。
CHAR(整数)
長さが整数 の固定長文字ストリングの場合。 長さの範囲は 1 から 32767 までです。
CHARACTER(整数)
長さが整数 の固定長文字ストリングの場合。 長さの範囲は 1 から 32767 までです。
VARCHAR(整数)
最大長が整数 の可変長文字ストリングの場合。 最大長の範囲は 1 から 32767 までです。
BLOB(整数)
バイト単位で最大長を指定した 2 進ラージ・オブジェクト・ストリングの場合。

長さの範囲は 1 バイトから 32767 バイトまでです。

整数 は最大長です。

DATE
日付。入力値の形式は次のいずれかです。MM/DD/YYYY、 YYYY-MM-DD、または DD.MM.YYYY。 日付値の印刷は ISO 形式 YYYY-MM-DD のみです。

特殊レジスター CURRENT DATE を使用しても、ISO 形式の 現在日付を生成できます。

TIME
時刻。入力値の形式は次のいずれかです。HH:MM AM (または PM)、 HH:MM:SS、HH.MM AM (または PM)、あるいは HH.MM.SS。HH:MM:SS または HH.MM.SS 形式において、SS は 秒を示すもので、指定はオプショナルです。 時刻値の印刷は ISO 形式 HH:MM:SS のみです。

特殊レジスター CURRENT TIME を使用しても、ISO 形式の 現在時刻を生成できます。

TIMESTAMP
タイム・スタンプ。入力値の形式は YYYY-MM-DD-HH.MM.SS.ZZZZZZ です。 タイム・スタンプ値の印刷の形式は YYYY-MM-DD-HH.MM.SS.ZZZZZZ です。

特殊レジスター CURRENT TIMESTAMP を使用しても、現在のタイム・スタンプを生成できます。

列オプション
表の列に関する追加のオプションを定義します。
NOT NULL
列にヌル値を含めることができないようにします。

NOT NULL が指定されていない場合、列にヌル値を入れることができます。 また、デフォルト値はヌル値か、DEFAULT 文節で提供された値になります。

PRIMARY KEY
これは、単一の列から構成される主キーをす早く定義するための方法を 提供します。つまり、PRIMARY KEY を列 C の定義に指定すると、 別個の文節として PRIMARY KEY(C) 文節を指定したのと同じことになります。

PRIMARY KEY の説明は、PRIMARY KEY にあります。

REFERENCES 表名
REFERENCES の説明は REFERENCES にあります。
CHECK (チェック条件)
CHECK の説明は CHECK にあります。
DEFAULT
INSERT ステートメントに値が指定されなかった場合に、デフォルト値を提供します。

列定義に DEFAULT が入っていないと、その列のデフォルトとしてヌル値が 使用されることになります。そのような列が NOT NULL で定義されていると、 その列には有効なデフォルトはないことになります。

定数
定数を列のデフォルト値として指定します。指定する定数は、以下のような ものでなければなりません。
  • その列に割り当て可能な値である。
  • この定数が 10 進定数である場合、列データ・タイプの位取りを超えて非ゼロの 桁を指定していない。(例えば、1.234 は DECIMAL(5,2) の列のデフォルトにはならない)
日時特殊レジスター
INSERT の時にこの列のデフォルトとして、 日時特殊レジスターの値 (CURRENT DATE、CURRENT TIME、または CURRENT TIMESTAMP) を指定します。 この列のデータ・タイプは、指定する特殊レジスターに対応したデータ・タイプで なければなりません。(例えば、CURRENT DATE を指定する場合は、 データ・タイプは DATE である必要があります。)
GENERATED ALWAYS AS IDENTITY
表を作成するときに、ユーザーは列を「GENERATED ALWAYS AS IDENTITY」と指定することができます。その後、この列の値は、ユーザーが INSERT または副選択付きの INSERT を行うたびに、DB2 Everyplace によって生成されます。 この列は数値タイプ (INTEGER、SMALLINT、または DECIMAL タイプ) である必要があり、DB2 Everyplace は、1 から始まり、毎回 1 ずつ増分される固有のシリアル番号を自動的に生成します。

IDENTITY 列に生成される値は 1 から始まり、表に行が挿入されるたびに 1 ずつ増えます。 そのため、DB2 Everyplace が IDENTITY 列上に索引を自動的に作成しなくても、一意性は保証されます。IDENTITY 列上に索引が必要な場合は、明示的に索引を作成するか、またはその列を PRIMARY KEY として指定する必要があります。IDENTITY 列の値の範囲が限界 (最大値) に達した場合は、さらに INSERT ステートメントが使用されると、エラー (SQLSTATE 23522) となります。INT タイプと SMALLINT タイプの IDENTITY 列の最大値は、それら 2 つのタイプで許可されている最大値となります。DECIMAL タイプの IDENTITY 列の最大値は、(1) そのデータ・タイプの定義 (精度、位取り) および (2) IDENTITY 列に許可されている最大値 (2.15* (10^18) (小数桁数 19)) によって決まります。(1) と (2) のいずれか小さい方が範囲の限界となります。DECIMAL タイプの IDENTITY 列の場合、値の小数部分は必ず 0 となり、整数部分は毎回 1 ずつ増分されます。

IDENTITY 指定は、データ・タイプが 3 つの数値タイプ (INT、 SMAIINT、DECIMAL) のいずれかである列でのみ定義できます。それ以外の場合はエラーとなります (SQLSTATE 42815)。表ごとに最大 1 つの IDENTITY 列が存在できます (その以外の場合はエラー SQLSTATE 428C1)。ユーザーは INSERT ステートメントに IDENTITY 列の値を指定することはできません (デフォルトにして、DB2 Everyplace システムが生成した値を使用するようにしなければなりません)。またユーザーは、IDENTITY 列を UPDATE することもできません。

PRIMARY KEY (列名, ...)
示された列で構成される主キーを定義します。この文節は 1 回しか指定しては ならず、示されている列は NOT NULL として定義する必要があります。 各列名は表の列を示すものでなければならず、同じ列を 2 回以上指定してはいけません。

指定できる列は 8 つまでです。

指定された列上に、固有の索引が自動的に作成されます。

1 つの表に定義できる主キーは、1 つだけです。

指定された各列の長さ属性は、1024 バイトを超えてはなりません。

参照制約
参照制約を定義します。
FOREIGN KEY (列名, ...)
指定した制約名で参照制約を定義します。

ステートメントの対象である表を T1 で表してみましょう。参照制約の外部キーは、 示された列で構成されます。列名のリストの中のそれぞれの名前は T1 の列を示すもので なければならず、また、同じ列を 2 回以上指定してはいけません。 指定できる列は 8 つまでです。外部キーは DB2 Everyplace では必須ではありません。

REFERENCES 表名
REFERENCES 文節に指定する表は、カタログにある基本表でなければなりませんが、 カタログ表を示すものであってはなりません。

参照制約の外部キーが、直前に指定した参照制約の外部キー表と同じである場合は、 その参照制約は重複しています。

次のケースでは、指定する親表を T2 で表し、作成されている表を T1 で表します。

指定された外部キーは T2 の親キーと同じ数の列を持っていなければならず、 外部キーの n 番目の列の記述は、その親キーの n 番目の列の記述に相当するもので なければなりません。日時列は、この規則上、ストリング列に相当するとは見なされません。 DB2 Everyplace では、外部キーは必須ではありません。

CHECK (チェック条件)
チェック制約を定義します。チェック条件 は、検索条件です。 列参照は、作成している表の列でなければなりません。表に挿入する、または更新する値は、 すべてのチェック制約を満たすものである必要があります。

チェック制約が列定義の一部として指定されている場合は、列の参照は同じ列に対してのみ 行うことができます。表定義の一部として指定されたチェック制約には、 事前に CREATE TABLE ステートメントで定義された列を示す列参照を持たせることが できます。不整合か、重複しているか、同じ条件かどうかのチェックは、 チェック制約に対しては行われません。 したがって、矛盾した、または重複したチェック制約が定義される場合があります。

チェック条件として「IS NOT NULL」を指定することはできますが、列の NOT NULL 属性を直接指定することにより、ヌルになるようにすることをお勧めします。 例えば、CHECK (salary + bonus > 30000) は salary が NULL にセットされていれば 受け入れられます。それは、CHECK の制約は、満足するか、不明かの いずれかでなければならず、このケースでは salary が不明であるためです。しかし、CHECK (salary IS NOT NULL) とすると、salary が NULL にセットされている場合、 誤りであり、制約に違反していると見なされます。

表に行を挿入したり、更新を行う場合は、チェック制約が適用されます。

CREATE TABLE ステートメントに定義されたすべてのチェック制約は、 一体化してシステム・カタログに保管されます。DB2 Everyplace では、 この一体化したチェック制約に 512 バイトまでという制限があります。

規則

注意事項

列名 EMPNO、FIRSTNAME、LASTNAME、DEPT、PHONENO、SALARY、および HIREDATE を 使用して表 EMPLOYEE を作成します。CHAR は、列に文字データが入ることを意味します。 NOT NULL は列にヌル値を入れることができないことを意味します。VARCHAR は、列に 可変長文字データが入ることを意味します。主キーは列 EMPNO からなります。

     CREATE TABLE EMPLOYEE
       (EMPNO       CHAR(3)    PRIMARY KEY,
        FIRSTNAME   VARCHAR(12)   NOT NULL,
        LASTNAME    VARCHAR(15)   NOT NULL,
        DEPT        CHAR(3),
        PHONENO     CHAR(4),
        SALARY      INT,
        HIREDATE    DATE)

関連した解説