Interbase (私は 2007 を使用していますが、それが重要かどうかはわかりません) に、SQL Server の SCOPE_IDENTITY() に似た、新しく挿入されたレコードの ID を取得するコマンドはありますか?
1 に答える
いいえ、InterBase には ID 機能がありません。
その代わり、InterBase にあるのはジェネレーター機能です。ジェネレーターは ID に似ていますが、主キー列から論理的に分離されています。言い換えれば、ジェネレーターは保証された一意の値を提供しますが、その値をどうするかはあなた次第です。
その値を、単一のテーブルまたは複数のテーブルの主キー値として使用できます。しかし、実際に主キーの値を割り当てることは、自分で行う必要があります。
のような機能がないことに加えて、InterBase にはステートメントSCOPE_IDENTITY
から値を返す機能がありません。INSERT
そのため、生成された主キーの値をINSERT
ステートメントから取得できないだけでなく、トリガーによって設定された値など、他の値も取得できません。
回避策
これに対する 1 つの考えられる回避策は、事前に主キー値を生成することです。したがって、次のようなことができます (使用しているプログラミング言語がわからないため、この例では InterBase ストアド プロシージャ構文を使用しますが、どのプログラミング言語でも同じことができます)。
DECLARE VARIABLE ID INTEGER;
BEGIN
ID = SELECT GEN_ID(MY_GENERATOR, 1) FROM RDB$DATABASE;
INSERT INTO MY_TABLE (ID, DESCRIPTION) VALUES (:ID, "Foo");
RDB$DATABASE
レコードが 1 つだけのシステム テーブルです。の値がわかればID
、proc から返すことができます。
2 番目の回避策はSELECT
、代替キーを使用してレコードを作成し、生成された ID をそのように読み取ることです。