S-JIS[2023-10-09/2024-08-31]
|
TsurugiのSQLでテーブルを作成するのがcreate table文。
create table [if not exists] テーブル名 ( カラム定義1, カラム定義2, … カラム定義N [, primary key (カラム名, …)] )
※create table 〜 as selectは未実装。
テーブルのカラム定義では、カラム名の後ろにデータ型を指定する。
カラム名 データ型 [カラム制約…]
カラム制約 | ver | 説明 |
---|---|---|
null |
1.0.0-BETA1 | nullが入れられる。 |
not null |
1.0.0-BETA1 | nullが入れられない。 |
primary key |
1.0.0-BETA1 | プライマリキー。(暗黙にnot nullになる) |
default |
1.0.0-BETA1 | insertでカラムを省略したときの値。 |
generated〜as identity |
1.0.0 | insert時に自動的に採番される。[2023-08-31] |
Tsurugiサーバーの内部では、テーブルのデータはKVS(Key Value Store)で格納されている。(実際はMasstreeという構造らしい)
つまりキー(プライマリキー)が必須である。
create tableでプライマリキーを指定しない場合、暗黙にキー(シーケンス)が生成される。
他のRDBMSではプライマリキー項目に対して(暗黙に)インデックスを作成するかもしれないが、
Tsurugi内部はKVSでありキーの昇順でデータが格納されるので、プライマリキーに対してインデックスという特別な何かは作成されない。
TsurugiはインメモリーDB(データはメモリー上に置く)なので、他のRDBMSのtablespace(データの格納先ディレクトリーやファイルサイズの上限等)のような指定は無い。
ただ、永続化の為にデータをファイル(ディスク)に保存することは行う。
その場所は構成定義ファイルのdatastoreセクションのlog_locationで指定する。
create table test ( foo int primary key, bar bigint, zzz varchar(10) );
create table test ( foo int, bar bigint, zzz varchar(10), primary key (foo) );
テーブルが存在しない場合のみテーブルを作成する。[2023-12-07]
Tsurugi 1.0.0-BETA2以降。
create table if not exists test ( foo int primary key, bar bigint, zzz varchar(10) );
テーブルが既に存在している場合は何もしない。(エラーにならない)
generated〜as identityを指定したカラムは、insert時に自動的に値を採番する。[2024-08-31]
Tsurugi 1.0.0以降。
カラム名 データ型 generated {always | by default} [(シーケンスオプション…)]
alwaysを指定すると、insert時に必ず値を採番する。このカラムに明示的に値を入れることは出来ないし、updateも出来ない。
by defaultを指定すると、insert時に(採番される以外の)値を明示して入れることが出来る。updateすることも出来る。
シーケンスオプション | ver | 説明 | 省略時の値 |
---|---|---|---|
start [with] |
1.0.0 | 開始値。 | incrementが正の場合はminvalue、負の場合はmaxvalue |
increment [by] |
1.0.0 | 増分。0は不可。 | +1 |
minvalue |
1.0.0 | 最小値。 | incrementが正の場合は1、負の場合はデータ型の最小値 |
no minvalue |
1.0.0 | ||
maxvalue |
1.0.0 | 最大値。 | incrementが正の場合はデータ型の最大値、負の場合は-1 |
no maxvalue |
1.0.0 | ||
cycle |
1.0.0 | 値が上限に達したときに下限に戻すかどうか。 cycleだと戻す。PKだった場合、戻した値のレコードが存在していたら一意制約違反になる。 no cycleだと上限エラーになる。 |
cycle |
シーケンスオプションを全て省略すると、開始値1・増分+1になる。
create table test ( id bigint primary key generated always as identity ); insert into test default values; → 1 insert into test default values; → 2 insert into test default values; → 3
(増分が+1で)開始値を0にしたい場合は、minvalueを0にする。
(incrementが正の場合、startのデフォルト値はminvalueなので、startは省略できる)
create table test ( id bigint primary key generated always as identity (minvalue 0) ); insert into test default values; → 0 insert into test default values; → 1 insert into test default values; → 2
minvalueを指定せずにstartを0にするとエラーになる。
採番される値はminvalueとmaxvalueの間に収まる必要があり、incrementが+1の場合のminvalueのデフォルトは1だから、範囲外になる為。
tgsql> create table test ( | id bigint primary key generated always as identity (start with 0) | ); COMPILE_EXCEPTION (SQL-03000: compile failed with error:invalid_sequence_value message:"initial value is out of range: 0 (min=1, max=9223372036854775807)" location:<input>:2:25+43)
by defaultで自動生成するカラムを定義した場合、そのカラムに明示的に値をinsertすることが出来る。
そして
自動採番するカラムがプライマリキーの場合、採番された値のレコードが既に存在していたら一意制約違反になる。
しかしエラーになっても採番される値が戻ることは無く、進んでいく。
create table test ( id bigint primary key generated by default as identity (start with 1 increment by +1), memo varchar(10) default 'default' ); insert into test default values; → 1 insert into test values(2, 'explicit'); → 2 insert into test default values; → UNIQUE_CONSTRAINT_VIOLATION_EXCEPTION insert into test default values; → 3 tgsql> select * from test; [id: INT8, memo: CHARACTER] [1, default] [2, explicit] [3, default] (3 rows)