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--表名----------------|
説明
表名は、カタログに保管される前に大文字に変換されます。 区切り ID (二重引用符付き) を使用すると、このような変換が行われないようにすることができます。 表名にブランクまたは特殊文字が含まれる場合は、区切り ID を使用する必要があります。
制約事項: ユーザー名によって作成および命名された表に対応するシステム作成のデータ・ファイルでは、 大文字と小文字は区別されません。 例えば、TB と命名された表のデータ・ファイルは、DSY_TB と命名されます。 「tb」と命名された表のデータ・ファイルもまた DSY_TB となります。 したがって、データ保全性を維持するために、文字ケースを除き、 既存の表名と同じ一連の文字を使用して表を命名しないようにすることを強くお勧めします。
ユーザー表を暗号化できるのは、ユーザー表の作成時のみです。 表が作成された後では、暗号化を追加したり、除去したり (表を削除する場合は除く) することはできません。
列名は、カタログに保管される前に大文字に変換されます。 区切り ID (二重引用符付き) を使用すると、このような変換が行われないようにすることができます。 また、列名にブランクまたは特殊文字が含まれている場合も、区切り ID を使用する必要があります。
長さの範囲は 1 バイトから 32767 バイトまでです。
整数 は最大長です。
特殊レジスター CURRENT DATE を使用しても、ISO 形式の 現在日付を生成できます。
特殊レジスター CURRENT TIME を使用しても、ISO 形式の 現在時刻を生成できます。
特殊レジスター CURRENT TIMESTAMP を使用しても、現在のタイム・スタンプを生成できます。
NOT NULL が指定されていない場合、列にヌル値を入れることができます。 また、デフォルト値はヌル値か、DEFAULT 文節で提供された値になります。
PRIMARY KEY の説明は、PRIMARY KEY にあります。
列定義に DEFAULT が入っていないと、その列のデフォルトとしてヌル値が 使用されることになります。そのような列が NOT NULL で定義されていると、 その列には有効なデフォルトはないことになります。
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 することもできません。
指定できる列は 8 つまでです。
指定された列上に、固有の索引が自動的に作成されます。
1 つの表に定義できる主キーは、1 つだけです。
指定された各列の長さ属性は、1024 バイトを超えてはなりません。
ステートメントの対象である表を T1 で表してみましょう。参照制約の外部キーは、 示された列で構成されます。列名のリストの中のそれぞれの名前は T1 の列を示すもので なければならず、また、同じ列を 2 回以上指定してはいけません。 指定できる列は 8 つまでです。外部キーは DB2 Everyplace では必須ではありません。
参照制約の外部キーが、直前に指定した参照制約の外部キー表と同じである場合は、 その参照制約は重複しています。
次のケースでは、指定する親表を T2 で表し、作成されている表を T1 で表します。
指定された外部キーは T2 の親キーと同じ数の列を持っていなければならず、 外部キーの n 番目の列の記述は、その親キーの n 番目の列の記述に相当するもので なければなりません。日時列は、この規則上、ストリング列に相当するとは見なされません。 DB2 Everyplace では、外部キーは必須ではありません。
チェック制約が列定義の一部として指定されている場合は、列の参照は同じ列に対してのみ 行うことができます。表定義の一部として指定されたチェック制約には、 事前に 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 バイトまでという制限があります。
規則
注意事項
このカウントは、リリースによって変わる場合があります。
各レコードには、NULL に関する情報も含まれています。NULL 情報は、32 列の各グループごとに 4 バイトを必要とします。
NULL 値は、依然として固定サイズの列サイズを使用します。
データ・タイプ | 列バイト・カウント |
---|---|
INTEGER | 4 |
SMALLINT | 4 |
DECIMAL(n, m) | 4 〜 20 |
CHAR(n) | n+1 |
VARCHAR(n) | i+5、i は実際の長さ |
BLOB | i+4、i は実際の長さ |
DATE | 4 |
TIME | 4 |
TIMESTAMP | 12 |
例
列名 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)
関連した解説