CREATE TABLE

CREATE TABLE コマンドは、空の新規表を現在のデータベース内に作成します。 CREATE TABLE コマンドは、表の 1 行に対応したタプル・タイプ (構造タイプ) を表すデータ型を自動的に作成します。

表には以下のような制限があります。
  • 既存のデータ型と同じ名前を持つことはできません。
  • システム・カタログ表と同じ名前を持つことはできません。
  • 1600 を超える列を持つことはできません。 タプルの長さの制約により、実際の制限はわずかに低くなります。
  • 以下の名前の表またはビューの属性を持つことはできません。
    • cmax
    • cmin
    • createxid
    • ctid
    • datasliceid
    • deletexid
    • oid
    • 行 ID (rowid)
    • tableoid
    • xmax
    • xmin

オプションの制約節では、挿入や更新の操作を正しく実行できるように、新規の行や更新された行が満たす必要のある制約 (またはテスト) が指定されます。 制約とは、名前付きのルールであり、表で使用される挿入、更新、または削除操作の結果を制限することで有効な値セットを定義できる、SQL オブジェクトのことです。 Netezza Performance Serverを指定する場合は、制約チェックと参照整合性を実行する必要があります)

テーブル制約とカラム制約を定義できます。
  • 列制約は、列定義の一部として定義される制約です。
  • 表制約は、特定の列に関連付けられるものではなく、複数の列を含むことができます。

また、いずれの列制約も表制約として記述することができます。 列制約が 1 つの列しか影響しない場合には、その制約は単なる表記上の制約となります。

分散指定
Netezza Performance ServerRDBMS データベースの各テーブルにはディストリビューションキーが 1 つだけあり、1 ~ 4 列で構成されます。 以下の SQL 構文を使用して、分散キーを作成することができます。
  • 明示的なディストリビューション・キーを作成するには、Netezza Performance ServerのSQL構文を使用します:
    CREATE TABLE <tablename> [ ( <col>[,<col>… ] ) ] AS 
    <select_clause> [ DISTRIBUTE ON [HASH] ( <col>[<col>,… ] ) ]

    distribute on というフレーズは分散キーを指定し、hash というワードはオプションです。

  • ラウンドロビン配布キーを作成するには、Netezza Performance ServerのSQL構文を次のようにします:
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int)
    DISTRIBUTE ON RANDOM;

    distribute on random というフレーズは、ラウンドロビン方式の分散を指定します。

  • ディストリビューション・キーを指定せずにテーブルを作成するには、Netezza Performance ServerのSQL構文を使用します:
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int);

    Netezza Performance Server・システムはディストリビューション・キーを選択します。 そのキーが何であるかを確認する方法はなく、Netezza Performance Serverのソフトウェア・リリースによって異なる可能性があります。

制約ルールの動作
制約の更新や削除を行った場合の動作を以下のように指定できます。 システムでは制約チェックを実行しないため、これらのルールは使用されるのではなく、単に容認されます。
  • CASCADE は、参照している列の値を被参照列の新しい値に更新します。
  • SET NULL は、参照している列を被参照列の新しい値に設定します。
  • SET DEFAULT は、被参照列を設定します。
  • RESTRICT は NO ACTION と同じです。
  • NO ACTION では、外部キーが違反の場合にエラーになります。
制約属性
制約には、制約チェックが即座に実行されるか延期されるかを決定する属性を以下のように指定できます。 システムでは制約チェックを実行しないため、これらの属性は使用されるのではなく、単に容認されます。
  • [NOT] DEFERRABLE は、トランザクションの終了時に制約チェックを実行するかどうかを決定します。
  • INITIALLY DEFERRED は、トランザクションの終了時のみに制約をチェックします。
  • INITIALLY IMMEDIATE は、各文の後に制約をチェックします。

構文

CREATE TABLE コマンドの一般的な構文
CREATE [ TEMPORARY | TEMP ] TABLE [IF NOT EXISTS] <table>
( <col> <type> [<col_constraint>][,<col> <type> [<col_constraint>]…]
[<table_constraint>[,<table_constraint>… ] )
[ DISTRIBUTE ON { RANDOM | [HASH] (<col>[,<col>…]) } ]
[ ORGANIZE ON { (<col>) | NONE } ]
[ ROW SECURITY ]
[ BACKUP { OFF | DATA OFF | ON } ]
[ DATA_VERSION_RETENTION_TIME <number-of-days> ]
[ STORAGETYPE { 'BLOCK' | 'OBJECT' } ]
ここで、<col_constraint> は、以下を表します。
[ CONSTRAINT <constraint_name> ] 
{NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <value> | <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
ここで、<table_constraint> は、以下を表します。
[ CONSTRAINT <constraint_name> ] 
{UNIQUE (<col>[,<col>…] ) |
PRIMARY KEY (<pkcol_name>[,<pkcol_name>…] ) |
FOREIGN KEY (<fkcol_name>[,<fkcol_name>…] ) <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
ここで、<ref> は、以下を表します。
REFERENCES <reftable> [ (<refcol_name>[,<refcol_name>…] ) ]
[ MATCH FULL ]
[ ON UPDATE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]
[ ON DELETE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]

システムでは、PRIMARY KEY、DEFAULT、FOREIGN KEY、UNIQUE、および REFERENCES について許可と管理を行います。 システムは、制約チェックおよび参照整合性をサポートしません。 各自が制約チェックと参照整合性を確認する必要があります。

入力

CREATE TABLE コマンドの入力は以下のとおりです。
表 1. CREATE TABLE の入力
入力 説明
TEMP[ORARY] 作成する表は、一時表になります。
IF NOT EXISTS 指定した名前の表が現行のデータベースおよびスキーマに存在する場合に、CREATE TABLE コマンドは、表を作成できなかったという理由でエラーをスローすることはありません。 このオプションは、通常、SQL コマンドを実行するスクリプト・アプリケーションで使用します。「表は既に存在します」というエラー・メッセージが出て、スクリプト・アプリケーションが影響を受けたり停止したりしないように、このエラー・メッセージを抑止するために使用します。 このオプションを指定する場合は、以下の動作に注意してください。
  • 表の作成を妨げる他のエラーが発生しない限り、このコマンドは、表を作成できなくても CREATE TABLE メッセージを返します。 (このオプションを指定すると、コマンドは、同じ名前の表が既に存在するというエラーを無視します)。
  • 既存の表とコマンドに指定した表の比較は行われません。つまり、それらの表の形状は異なる可能性があります。 既存の表の形状および行コンテンツは現状のまま、変更されずに残されます。 アプリケーションは、ターゲットの表および行が予期したものであることを確認する必要があります。
  • IF NOT EXISTS 構文は、AS SELECT 節と一緒には使用できません。 そのような形式の CREATE TABLE コマンドは、エラーをスローします。 もし、CREATE TABLE ... を実行したいのであれば。 AS SELECTでは、CREATE TABLE ... を使用する前に、まずDROP TABLE IF EXISTSコマンドを呼び出し、対象となるテーブルがデータベースとスキーマに存在しないことを確認してください。 AS SELECTコマンド。
<table> 作成する表の名前。
<col> 新しい表に作成される列の名前。
<type> 列のデータ・タイプ。
DISTRIBUTE ON データベース内の各表には、1 から 4 列で構成される分散キーが存在している必要があります。 デフォルトは RANDOM です。これは、システムにランダム分散キーを選択させます。
HASH このパラメーターは明確にするために指定できますが、コマンドには影響しません。
ORGANIZE ON 表の編成基準として使用する列 (1 列から 4 列)。 これは外部表には指定できません。 列が指定されている場合、表にマテリアライズ・ビューを含めることができません。さらに、指定されたすべての列データ型はゾーン・マップ可能でなければなりません。 表データの再編成は、GROOM TABLE が実行されるときに有効になります。
ROW SECURITY 行レベル・セキュリティーを使用して表を作成します。

DATA_VERSION_RETENTION_TIMEに0以外の値が指定された場合、コマンドは失敗する。 詳細については、 Netezza Performance Serverタイムトラベルを参照してください。

<constraint_name> 列制約または表制約に付けられる名前。 名前を指定しない場合、システムが名前を生成します。
NOT DEFERRABLE | DEFERRABLE 制約をトランザクションの終了まで延期できるかどうかを制御します。 デフォルトは、NOT DEFERRABLE です。 Netezza Performance Serverは制約チェックと参照整合性をサポートしていません)
INITIALLY DEFERRED (トランザクションの終了時点) または IMMEDIATE (それぞれの文の終了時点) のいずれかを指定します。
NOT NULL | NULL 列に NULL 値を含めることができるかどうか。 NULL がデフォルトです。
UNIQUE (列および表制約) 列の各値が固有である必要があるかどうか。
PRIMARY KEY (列および表制約) 指定した列が表の主キーを形成するかどうか。

この制約は、本質的に UNIQUE 制約と NOT NULL 制約を組み合わせたものですが、列のセットを主キーとして指定することで、スキーマの設計に関するメタデータにもなります。 主キーは、他の表から、この列セットを行の固有 ID として信頼できることを意味します。

列制約として、または表制約として、1 つの表に対して 1 つの PRIMARY KEY 制約のみを指定できます。

主キーを構成する列セットは、その表に対して定義された UNIQUE 制約で指定された列の他のセットとは異っている必要があります。

DEFAULT (列制約) この列の各行に配置されるデフォルト値。
REFERENCES (列制約) 新規表の指定された列には、指定された表の指定された列内の値と一致する値のみが含まれている必要があります。
FOREIGN KEY および REFERENCES 表 (表制約) 新規表の指定された列には、指定された表の指定された列内の値と一致する値のみが含まれている必要があります。 列を指定しない場合、値は表の主キーと一致している必要があります。 参照表の指定された列には、その表の UNIQUE 制約または PRIMARY KEY 制約が必要です。
MATCH FULL MATCH FULL を指定すると、複数列からなる外部キーの 1 つの列は、外部キーの他の部分が NULL ではない場合に、NULL を持つことができません。 これがデフォルトです。 MATCH PARTIAL はサポートされません。
ON UPDATE | ON DELETE 指定された表または列が更新または削除されたときに実行されるアクション。
NO ACTION
外部キーが違反の場合に、エラーが発行されます。 これがデフォルトです。
RESTRICT
NO ACTION と同じです。
CASCADE
削除された行を参照するすべての行を削除します。
SET NULL
参照している列の値をデフォルト値に設定します。
SET DEFAULT
参照している列の値をデフォルト値に設定します。
DATA_VERSION_RETENTION_TIME <日数

保持時間を持つテーブルを作成する。 タイムトラベル・クエリを実行したい場合は、DATA_VERSION_RETENTION_TIMEを指定する必要があります。

デフォルト値は「0」です。 最大許容値は99日。

DATA_VERSION_RETENTION_TIMEが指定されない場合、テーブルのスキーマに指定された現在の保持時間が設定されます。

保持時間が0に設定されている場合、テーブルは一時テーブルではなく、タイムトラベル・クエリではテーブルの履歴データは使用できません。 保持時間が0に設定されたテーブルに対してタイムトラベル・クエリを実行することはできません。

リテンション・タイムがゼロ以外の値に設定されている場合、そのテーブルはテンポラル・テーブルである。 DATA_VERSION_RETENTION_TIMEで指定された日数さかのぼったヒストリ行は、タイムトラベル・クエリで使用できます。

CREATE TEMPORARY TABLEでDATA_VERSION_RETENTION_TIMEを使用することはできません。 すべての一時テーブルは非時間的であり、タイムトラベルクエリをサポートしていません。

タイムトラベルとDATA_VERSION_RETENTION_TIMEの詳細については、 タイムトラベルを始めるを参照してください。

STORAGETYPE <storage_type>(ストレージタイプ)

テーブルの保存先を指定する('Block' または 'Object' )。

出力

コマンドの出力は以下のとおりです。

表 2. CREATE TABLE の出力
出力 説明
CREATE TABLE コマンドが正しく終了した場合にシステムがこのメッセージを返します。
ERROR 表の作成が失敗した場合にシステムがこのメッセージを返します。 エラーメッセージには、次のような説明文が表示される:ERROR: Relation 'table' already existsまたはその他のメッセージ。 IF NOT EXISTS 構文を指定した場合は、同じ名前の表が既に現行のデータベースおよびスキーマに存在していても、システムはエラーをスローしません。

特権

admin ユーザー、またはデータベースかスキーマの所有者であるか、あるいはアカウントが Create Table 特権を持っている必要があります。

使用法

以下に使用例を示します。

  • 表を作成するには、
       CREATE TABLE name (
           code        CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY,
           title       CHARACTER VARYING(40) NOT NULL,
           did         DECIMAL(3) NOT NULL,
           date_prod   DATE,
           kind        CHAR(10),
           len         INTERVAL HOUR TO MINUTE
       );
  • 一時テーブルを作成する:
    CREATE TABLE PRODUCT (prodid int, proddesc char(100)) DATA_VERSION_RETENTION_TIME 30;
  • films 表に対して PRIMARY KEY 表制約を定義するには、その表の複数の列に PRIMARY KEY 表制約を定義することができます。
    CREATE TABLE films (
           code        CHAR(5),
           title       VARCHAR(40),
           did         DECIMAL(3),
           date_prod   DATE,
           kind        VARCHAR(10),
           len         INTERVAL HOUR TO MINUTE,
           CONSTRAINT code_title PRIMARY KEY(code,title)
       );
  • distributors 表に PRIMARY KEY 制約を定義するには、次を実行します。
    CREATE TABLE distributors (
        did     DECIMAL(3),
        name    CHAR VARYING(40),
        PRIMARY KEY(did)
    ); CREATE TABLE distributors (
        did     DECIMAL(3) PRIMARY KEY,
        name    VARCHAR(40)
    );

    これらの 2 つの例は同じです。 最初の例では、表制約構文を使用しています。 2 番目の例では、列制約の表記を使用しています。

  • いずれか 1 つが明示的な名前となる 2 つの NOT NULL 列制約を distributors 表に定義するには、次を実行します。
    CREATE TABLE distributors (
           did     DECIMAL(3) CONSTRAINT no_null NOT NULL,
           name    VARCHAR(40) NOT NULL
       );
  • テーブル作成時に storagetype 、以下の構文で定義する:
    CREATE TABLE distributors (
        did          INT,
        storagetype  OBJECT
    );
    

watsonx.dataの考察

デフォルトでは、データレイク・リモート・データベースで CREATE TABLE