INSERT ステートメントの後で SERIAL 列の値を取得する最も効率的な方法は何ですか? つまり、MS SQL の複製@@IDENTITY
または機能の方法を探しています。SCOPE_IDENTITY
4 に答える
最後の SERIAL 挿入の値は、sqlerrd 配列の 2 番目のエントリとして、SQLCA レコードに格納されます。ブライアンの答えは ESQL/C では正しいですが、使用している言語について言及していません。
ストアド プロシージャを作成している場合、値は次のように見つけることができます。
LET new_id = DBINFO('sqlca.sqlerrd1');
$sth->{ix_sqlerrd}[1]
DBI を使用している場合にも見つかります
他の言語/インターフェース用のバリアントがありますが、きっと理解できると思います。
これが使われているのを見たことがあります。
if LOCAL_SQLCA^.sqlcode = 0 then
/* return serial */
Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
Result := -(Abs(LOCAL_SQLCA^.sqlcode));
ここで探している言葉は「効率的」ではないと思います。それは正確さの問題です。SQL Books Onlineよりもうまく説明できるかどうかはわかりませんが、一般的に、自分が何をしているかを本当に理解していて、@@ IDENTITYを使用する特別な理由がない限り、SCOPE_IDENTITYを使用してください。これの最も明白な理由は、テーブルにトリガーがアタッチされている場合、@@IDENTITYがprogram/ sp/etcによって追加された最新のレコードのIDを返さないことです。また、2つのトランザクションが同時に発生し、次のような問題が発生する大量のアプリケーションで問題が発生する可能性があります...
- あなたの挿入物
- 他のユーザーの挿入
- 他のユーザーのIDをあなたに返します
OPは、使用されているInformixのバージョンを指定していないため、異なる回答が存在する可能性があります