AnalyticDB for PostgreSQL のテーブルは、リレーショナルデータベースのテーブルと同様に動作しますが、1 つの重要な違いがあります:行がコンピュートノード間で分散される点です。各テーブルのディストリビューションポリシーによって、行がどのように分散されるかが決定されます。
標準テーブルの作成
CREATE TABLE を使用してテーブルを定義します。テーブル作成時に、以下の項目を指定できます:
構文:
CREATE TABLE table_name (
[ { column_name data_type [ DEFAULT default_expr ] -- 列定義
[column_constraint [ ... ]] -- 列レベルの制約
]
| table_constraint -- テーブルレベルの制約
])
[ WITH ( storage_parameter=value [, ... ] ) ] -- ストレージモデル
[ DISTRIBUTED BY (column, [ ... ] ) | DISTRIBUTED RANDOMLY ] -- 分散キー
[ partition clause] -- パーティショニング戦略例:
以下の例では、sales テーブルを作成し、trans_id を分散キーとして、日付に基づく範囲パーティショニングを適用しています。
CREATE TABLE sales (
trans_id int,
date date,
amount decimal(9,2),
region text)
DISTRIBUTED BY (trans_id)
PARTITION BY RANGE(date)
(start (date '2018-01-01') inclusive
end (date '2019-01-01') exclusive every (interval '1 month'),
default partition outlying_dates);一時テーブルの作成
一時テーブルは、セッションまたはトランザクションの実行期間中に中間データを格納するために使用されます。デフォルトでは、一時テーブルはセッション終了時に自動的に削除されます。
構文:
CREATE TEMPORARY TABLE table_name(...)
[ON COMMIT {PRESERVE ROWS | DELETE ROWS | DROP}]ON COMMIT 句を使用すると、現在のトランザクション終了時にテーブルに対してどのような処理が行われるかを制御できます。
| オプション | 動作 |
|---|---|
PRESERVE ROWS | すべての行を保持します(デフォルト動作)。 |
DELETE ROWS | すべての行を削除しますが、テーブル構造は保持します。 |
DROP | テーブル全体を削除します。 |
例:
CREATE TEMPORARY TABLE temp_foo (a int, b text) ON COMMIT DROP;制約の定義
制約は、列レベルまたはテーブルレベルで、テーブルに格納可能なデータを制限します。
制約を定義する前に、以下のルールを確認してください:
CHECK制約は、定義対象のテーブル内の列のみを参照できます。UNIQUE制約およびPRIMARY KEY制約には、分散キーを含める必要があります。これらの制約は、追加最適化(AO)テーブルおよび列指向テーブルでは許可されません。FOREIGN KEY制約は定義可能ですが、強制されません。1 つのパーティションで定義された制約は、他のすべてのパーティションにも適用されます。個別のパーティションに対して制約をスコープ指定することはできません。
構文:
UNIQUE ( column_name [, ... ] )
| PRIMARY KEY ( column_name [, ... ] )
| CHECK ( expression )
| FOREIGN KEY ( column_name [, ... ] )
REFERENCES table_name [ ( column_name [, ... ] ) ]
[ key_match_type ]
[ key_action ]
[ key_checking_mode ]CHECK 制約
CHECK 制約は、列値がブール値式を満たすことを要求します。
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0)
);NOT NULL 制約
NOT NULL 制約は、列に NULL 値を含めることを禁止します。
CREATE TABLE products (
product_no integer NOT NULL,
name text NOT NULL,
price numeric
);UNIQUE 制約
UNIQUE 制約は、列または列グループの値がすべての行にわたって一意であることを保証します。テーブルはハッシュ分散である必要があり、制約対象の列には分散キーを含める必要があります。
CREATE TABLE products (
product_no integer UNIQUE,
name text,
price numeric)
DISTRIBUTED BY (product_no);PRIMARY KEY 制約
PRIMARY KEY 制約は、UNIQUE 制約と NOT NULL 制約を組み合わせたものです。テーブルはハッシュ分散である必要があり、制約対象の列には分散キーを含める必要があります。
テーブルにプライマリキーが定義されている場合、プライマリキー列(または列グループ)がデフォルトで分散キーとして使用されます。
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric)
DISTRIBUTED BY (product_no);