CREATE TABLE コマンドは、空の新規表を現在のデータベース内に作成します。CREATE TABLE コマンドは、表の 1 行に対応したタプル・タイプ (構造タイプ) を表すデータ型を自動的に作成します。
オプションの制約節では、挿入や更新の操作を正しく実行できるように、新規の行や更新された行が満たす必要のある制約 (またはテスト) が指定されます。制約とは、名前付きのルールであり、表で使用される挿入、更新、または削除操作の結果を制限することで有効な値セットを定義できる、SQL オブジェクトのことです。 Netezza® は、制約チェックをサポートしていません。制約を指定する場合は、制約チェックを実行し、参照整合性を確認する必要があります。
また、いずれの列制約も表制約として記述することができます。列制約が 1 つの列しか影響しない場合には、その制約は単なる表記上の制約となります。
CREATE TABLE <tablename> [ ( <col>[,<col>… ] ) ] AS
<select_clause> [ DISTRIBUTE ON [HASH] ( <col>[<col>,… ] ) ]
distribute on というフレーズは分散キーを指定し、hash というワードはオプションです。
CREATE TABLE <tablename> (col1 int, col2 int, col3 int)
DISTRIBUTE ON RANDOM;
distribute on random というフレーズは、ラウンドロビン方式の分散を指定します。
CREATE TABLE <tablename> (col1 int, col2 int, col3 int);
分散キーは Netezza システムが選択します。どのキーが選択されるか確認する方法はなく、Netezza のソフトウェア・リリースによって異なる可能性があります。
CREATE [ TEMPORARY | TEMP ] TABLE <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 ]
[ CONSTRAINT <constraint_name> ]
{NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <value> | <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
[ 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 ]
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 について許可と管理を行います。IBM® Netezza システムでは、制約チェックおよび参照整合性をサポートしません。各自が制約チェックと参照整合性を確認する必要があります。
| 入力 | 説明 |
|---|---|
| TEMP[ORARY] | 作成する表は、一時表になります。 |
| <table> | 作成する表の名前。 |
| <col> | 新しい表に作成される列の名前。 |
| <type> | 列のデータ型。 |
| DISTRIBUTE ON | データベース内の各表には、1 から 4 列で構成される分散キーが存在している必要があります。デフォルトは RANDOM です。これは、システムにランダム分散キーを選択させます。 |
| HASH | このパラメーターは明確にするために指定できますが、コマンドには影響しません。 |
| ORGANIZE ON | 表の編成の対象となる列 (1 から 4 列)。 これは外部表には指定できません。 列が指定されている場合、表にマテリアライズ・ビューを含めることができません。さらに、指定されたすべての列データ型はゾーン・マップ可能でなければなりません。 表データの再編成は、GROOM TABLE が実行されるときに有効になります。 詳しくは、「IBM Netezza システム管理者ガイド」の『クラスター基本表の使用』を参照してください。 |
| ROW SECURITY | 行レベル・セキュリティーを使用して表を作成します。 |
| <constraint_name> | 列制約または表制約に付けられる名前。名前を指定しない場合、システムが名前を生成します。 |
| NOT DEFERRABLE | DEFERRABLE | 制約をトランザクションの終了まで延期できるかどうかを制御します。デフォルトは、NOT DEFERRABLE です。(Netezza では、制約チェックおよび参照整合性をサポートしません。) |
| 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 | 指定された表または列が更新または削除されたときに実行されるアクション。
|
コマンドの出力は以下のとおりです。
| 出力 | 説明 |
|---|---|
| CREATE TABLE | コマンドが正しく終了した場合にシステムがこのメッセージを返します。 |
| ERROR | 表の作成が失敗した場合にシステムがこのメッセージを返します。エラー・メッセージには、「ERROR: Relation 'table' already exists」のような説明文が含まれています。 |
admin ユーザー、またはデータベースかスキーマの所有者であるか、あるいはアカウントが Create Table 特権を持っている必要があります。
以下に使用例を示します。
MYDB.SCH1(USER)=>
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
);
MYDB.SCH1(USER)=>
CREATE TABLE name (
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)
);
MYDB.SCH1(USER)=> CREATE TABLE distributors (
did DECIMAL(3),
name CHAR VARYING(40),
PRIMARY KEY(did)
);
MYDB.SCH1(USER)=> CREATE TABLE distributors (
did DECIMAL(3) PRIMARY KEY,
name VARCHAR(40)
);
これらの 2 つの例は同じです。 最初の例では、表制約構文を使用しています。 2 番目の例では、列制約の表記を使用しています。
MYDB.SCH1(USER)=> CREATE TABLE distributors (
did DECIMAL(3) CONSTRAINT no_null NOT NULL,
name VARCHAR(40) NOT NULL
);