4Dのテーブルジェネレータを作っている。GUIは使えないのでExecute SQLで作成する。
4Dのテーブルは少し前からプライマリーキーが必須になり、IDという名前のフィールドを自動的にプライマリーキーにしてくれるような機能がある。自分の作るテーブルジェネレータでもプライマリーキーをセットしたい。という動機でやってみたら意外とハマったので顛末をまとめてみた。まずは普通のSQL。実行コードは次のようになる。
$sql:="create table staff3(id longint , name varchar(20));"
ON ERR CALL("JCL_D02_OnErrCall_SQL_EXECUTE")
SQL LOGIN(SQL_INTERNAL; ""; "")
SQL EXECUTE($sql)
SQL LOGOUT
ON ERR CALL("")
大抵は一発で通らないのでエラー処理することになる。エラー処理についてのブログはこちら。
プライマリーキー
プライマリーキーをセットするSQL文は次。
$sql:="create table staff_PK(st_id longint PRIMARY KEY, name varchar(20));"
実行結果はストラクチャーを見るとこうなる。
重複不可、ヌル値の入力を拒否、インデックス(B-tree)がセットされた。
ではプライマリーキー以外のフィールドにこれら3つの属性をそれぞれ独立してセットしたかったらどうするか。インデックスは4Dコマンドがあるのでそれを使うとして残りの2つ、重複不可はUNIQUE属性、ヌル値の入力を拒否はNOT NULL属性を使えば良さそうだ。
ヌル値の入力を拒否(NOT NULL)
$sql:="create table staff_NN(st_id longint, name varchar(20) Not null);"
これはうまくいった。
SQL文に「Not null」属性を記述して実行したら、4D のストラクチャーでは「ヌル値の入力を拒否」にチェックが付いた。
重複不可(UNIQUE)
次はUNIQUEだが、次の構文はエラー。
$sql:="create table staff_UQ(st_id longint, st_name varchar(20) UNIQUE);"
いろいろ試してみたところ、どうやら次のようにNot nullと一緒に記述しなくてはならないようだ。
$sql:="create table staff_UNIQUE(st_id INT32, st_name varchar(20) Not null UNIQUE);"
先にNot nullを記述する必要があるらしく、「UNIQUE Not null」の順番でもNGだった。4Dのストラクチャーは次のようになる。
重複不可はチェックとヌル値の入力を拒否はチェックされててOKだが、インデックスが自動になってしまった。
インデックス(CREATE INDEX)については、4DのCREATE INDEXを使う。これはまた別のブログで紹介する。