Oracle 12c以降、IDENTITYフィールドを使用できます。Oracleが最後に挿入されたIDENTITYを取得します
最後に挿入されたID(つまり、select @@identity
またはselect LAST_INSERTED_ID()
など)を取得する方法はありますか?
Oracle 12c以降、IDENTITYフィールドを使用できます。Oracleが最後に挿入されたIDENTITYを取得します
最後に挿入されたID(つまり、select @@identity
またはselect LAST_INSERTED_ID()
など)を取得する方法はありますか?
Oracleは、12cのIDENTITY機能に順序とデフォルト値を使用します。したがって、質問のシーケンスについて知る必要があります。
まず、テスト用のIDテーブルを作成します。
CREATE TABLE IDENTITY_TEST_TABLE
(
ID NUMBER GENERATED ALWAYS AS IDENTITY
, NAME VARCHAR2(30 BYTE)
);
まず、このID列で作成されたシーケンス名を見つけます。このシーケンス名は、テーブルのデフォルト値です。
Select TABLE_NAME, COLUMN_NAME, DATA_DEFAULT from USER_TAB_COLUMNS
where TABLE_NAME = 'IDENTITY_TEST_TABLE';
は私のために、この値は "ISEQ $$ _ 193606" である
は、いくつかの値を挿入します。
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla');
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('aydın');
次に、値を挿入し、同一性を検索します。
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla');
SELECT "ISEQ$$_193606".currval from dual;
あなたのID値が表示されます。 1ブロックで使いたい場合は
declare
s2 number;
begin
INSERT INTO IDENTITY_TEST_TABLE (name) VALUES ('atilla') returning ID into s2;
dbms_output.put_line(s2);
end;
最後のIDは自分のID列名です。
これは唯一の正解です。挿入しようとしている同じセッションで '
あなたのスコープ、グローバルまたは最後のユーザーを挿入は何ですか?具体的には、トランザクション内であなたのインサート&クエリをカプセル化した場合 グローバルの場合は、ちょうど
SELECT mytable_seq.nextval MyTableID FROM DUAL
https://www.sitepoint.com/community/t/oracle-last-insert-id-question/1402
を使用しています。それが使用するテーブルを使用して自動的にシーケンスを作成し、ドロップ -
IDENTITY
列は「フードの下」SEQUENCE
を使用します。 また、 を1000から始まり2ずつ増やしてstartとincrementのパラメータを指定することができます。IDENTITY
を使用することは、値を直接操作したくない場合には非常に便利です。
しかし、あなたが何らかの形で直接シーケンスを操作する必要がある場合は、Oracle 12cに利用できる 別のオプションを使用する必要があり - 列のデフォルト値を。 Sutchデフォルト 値はシーケンスnextval
またはcurrval
から生成することができます。わかりやすいシーケンス名を持ち、それをトリガーなしで「アイデンティティ」として使用できるようにする。
create table my_new_table
(id number default my_new_table_seq.nextval not null)
いつでも電話できるのはmy_new_table_seq.currval
です。
RETURNING
句を使用してINSERT文にSEQUENCE
から生成されたIDを取得することが可能です。例えば
、一時テーブルを作成します。
create global temporary table local_identity_storage ("id" number) on commit delete rows
いくつかの挿入は一時テーブルにこの値を保存してください:
CREATE TABLE identity_test_table (
id_ident NUMBER GENERATED BY DEFAULT AS IDENTITY,
same_value VARCHAR2(100)
);
declare
v_id number(10, 0);
begin
INSERT INTO identity_test_table
(same_value)
VALUES
('Test value')
RETURNING id_ident INTO v_id;
insert into local_identity_storage ("id") values (v_id);
commit;
end;
今、あなたは "ローカル" 挿入IDを持っています。
select "id" from local_identity_storage
オラクル社では、IDがサポートされているというだけでIDENTITY
を実装したようです。すべてはまだSEQUENCES
を使用して実装されており、作業の一部を行うためにSEQUENCE
にアクセスする必要があります(最新のIDENTITY
を取得するなど)。
IDENTITY
をMySQL、SQL Server、DB2などと同様に取得する方法はありません。SEQUENCE
を使用して取得する必要があります。
はい、SEQUENCEよりも抽象的ですが、INSERT節の構文が変更されます。パフォーマンスに反映されます。 3つの異なる手法(ここでは[https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1]から取得した結果)を使用して、このテスト(Oracle 12cで挿入)を確認してください。 1)TRIGGER_IDENTITY :時間= 217hsecs CPU時間= 204hsecs; 2)直接使用シーケンス:時間= 26hsecs CPU時間= 22hsecs; 3)REAL_IDENTITY:時間= 28hsecs CPU時間= 26hsecs。 –
Oracle Databaseへの移行を容易にするために行われました。手動でシーケンスやトリガを作成して挿入時に起動する必要はありません。データベースがこれを実行します。私はオラクルについては言及していませんが、移行を支援するために他に何をしたのか興味があれば、その件に関するホワイトペーパーがあります。 – thatjeffsmith
@thatjeffsmith私は正確に移行を行っていますが、他のDBMSと同様の動作をすることなく、作業は難しいです。 – bubi
それは `identity`列がまだバックグラウンドでシーケンスを使用して、最後に挿入された行
を取得するのに役立ちます
を確認してください。最後に生成された値を得るために通常の 'sequence.currval'を使うことができます。 –
問題はシーケンスの名前を知る必要があることです。 Actaullyは、テーブルの名前とレコードを挿入したスキーマの名前(シーケンスの名前はそれらに関連しています)を知るのは難しいです。 – bubi
挿入しているテーブルの名前を知ることはできませんか? –