トリガーの使用以外にオラクルで自動インクリメントを達成する他の方法は何ですか?
9 に答える
Oracle シーケンスを作成して使用できます。構文と詳細は http://www.techonthenet.com/oracle/sequences.phpにあります。
また、記事 http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html を読んで、他の RDBMS の AUTONUMBER に関する制限を理解してください。
連番が必要なく、一意の ID だけが必要な場合は、SYS_GUID() の DEFAULT を使用できます。すなわち:
CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() )
シーケンスから次の値を取得するためのトリガーは、AUTOINCREMENT と同等のものを実現する最も一般的な方法です。
create trigger mytable_trg
before insert on mytable
for each row
when (new.id is null)
begin
select myseq.nextval into :new.id from dual;
end;
挿入を制御する場合、トリガーは必要ありません。挿入ステートメントでシーケンスを使用するだけです。
insert into mytable (id, data) values (myseq.nextval, 'x');
これは、呼び出し元がシーケンスを参照する必要がないように、API パッケージ内に隠すことができます。
mytable_pkg.insert_row (p_data => 'x');
ただし、トリガーを使用すると、より「透過的」になります。
シーケンスを作成します。
create sequence seq;
次に、値を追加します
insert into table (id, other1, other2)
values (seq.nextval, 'hello', 'world');
注: シーケンスに関するその他のオプション (開始値、増分など) については、Oracle ドキュメントを参照してください。
オラクル時代から思い出す限り、TRIGGER を使用せずに Auto Increment 列を実現することはできません。自動インクリメント列を作成するための解決策には、 TRIGGER と SEQUENCE が含まれます(これはすでに知っていると想定しているため、トリガーの発言はありません)。
「トリガーベース」のソリューションを本当に使用したくない場合は、プログラムによるアプローチで自動インクリメント機能を実現し、getGeneratedKeys()
メソッドで自動インクリメント キーの値を取得できます。
検討用のコード スニペットを次に示します。
Statement stmt = null;
ResultSet rs = null;
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_UPDATABLE);
stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTable");
stmt.executeUpdate("CREATE TABLE autoIncTable ("
+ "priKey INT NOT NULL AUTO_INCREMENT, "
+ "dataField VARCHAR(64), PRIMARY KEY (priKey))");
stmt.executeUpdate("INSERT INTO autoIncTable (dataField) "
+ "values ('data field value')",
Statement.RETURN_GENERATED_KEYS);
int autoIncKeyFromApi = -1;
rs = stmt.getGeneratedKeys();
if (rs.next()) {
autoIncKeyFromApi = rs.getInt(1);
}
else {
// do stuff here
}
rs.close();
ソース: http://forums.oracle.com/forums/thread.jspa?messageID=3368856
たとえば、FerranB の回答に加えて
、MySQL での auto_incement の動作とは対照的に、おそらく言及する価値があります。
SELECT max (id) + 1
FROM table