【告知】シーケンス番号とSQLエンジンの関係について
【告知】シーケンス番号とSQLエンジンの関係について
Sequence numberは,4Dのランゲージに古くから存在する,テーブル毎に一意の識別子を発行するための仕組みです。
古いバージョンでは,作成したレコードのシーケンス番号をトリガイベントで代入したり,フォームオブジェクトに『#N』というデフォルト値を設定することが一般的でした。v11以降,フィールドの自動インクリメントプロパティを使用することが勧められています。
4D(CREATE RECORD/SAVE RECORD等)またはSQL(INSERT),どちらの言語でレコードを作成したとしても,DB4D(データベースエンジン)のコンテキストでは自動インクリメントの仕組みが働き,新しいシーケンス番号が発行されます。次に発行される番号は,GET DATABASE PARAMETERのTable sequence numberオプションで取得することができます。
しかし,両言語を同じプロセス内で併用する場合には,注意が必要です。コマンドのSequence numberは,作成中の新規カレントレコード,あるいはカレントレコードがない場合,"予備"カレントレコードを参照して番号を返しています。この番号は,プロセス内のBegin SQL/End SQL構文でレコードが作成されても更新されません。SQLには,カレントレコードの概念がないためです。SQLでレコードを作成した後にSequence numberをコールした場合,レコードを追加する前と同じ番号が返されます。これは仕様です。
例(5件とも同じシーケンス番号が代入される)
For ($i;1;5)
$SeqNr:=Sequence number([Article])
Begin SQL
INSERT INTO Article(ID) VALUES(:$SeqNr);
End SQL
End for
前述したように,データベースエンジンレベルでは番号が更新されているので,Sequence numberではなく,自動インクリメントを使用することにより,こうした問題を回避することができます。
古いバージョンでは,作成したレコードのシーケンス番号をトリガイベントで代入したり,フォームオブジェクトに『#N』というデフォルト値を設定することが一般的でした。v11以降,フィールドの自動インクリメントプロパティを使用することが勧められています。
4D(CREATE RECORD/SAVE RECORD等)またはSQL(INSERT),どちらの言語でレコードを作成したとしても,DB4D(データベースエンジン)のコンテキストでは自動インクリメントの仕組みが働き,新しいシーケンス番号が発行されます。次に発行される番号は,GET DATABASE PARAMETERのTable sequence numberオプションで取得することができます。
しかし,両言語を同じプロセス内で併用する場合には,注意が必要です。コマンドのSequence numberは,作成中の新規カレントレコード,あるいはカレントレコードがない場合,"予備"カレントレコードを参照して番号を返しています。この番号は,プロセス内のBegin SQL/End SQL構文でレコードが作成されても更新されません。SQLには,カレントレコードの概念がないためです。SQLでレコードを作成した後にSequence numberをコールした場合,レコードを追加する前と同じ番号が返されます。これは仕様です。
例(5件とも同じシーケンス番号が代入される)
For ($i;1;5)
$SeqNr:=Sequence number([Article])
Begin SQL
INSERT INTO Article(ID) VALUES(:$SeqNr);
End SQL
End for
前述したように,データベースエンジンレベルでは番号が更新されているので,Sequence numberではなく,自動インクリメントを使用することにより,こうした問題を回避することができます。
miyako- 投稿数 : 483
登録日 : 2016/07/05
Permissions in this forum:
返信投稿: 不可
|
|