23

トリガーの使用以外にオラクルで自動インクリメントを達成する他の方法は何ですか?

4

9 に答える 9

18

Oracle シーケンスを作成して使用できます。構文と詳細は http://www.techonthenet.com/oracle/sequences.phpにあります。

また、記事 http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html を読んで、他の RDBMS の AUTONUMBER に関する制限を理解してください。

于 2008-11-25T11:07:17.243 に答える
16

連番が必要なく、一意の ID だけが必要な場合は、SYS_GUID() の DEFAULT を使用できます。すなわち:

CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() )
于 2008-11-25T11:53:37.943 に答える
11

シーケンスから次の値を取得するためのトリガーは、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');

ただし、トリガーを使用すると、より「透過的」になります。

于 2008-11-25T13:09:56.323 に答える
3

シーケンスを作成します。

create sequence seq;

次に、値を追加します

insert into table (id, other1, other2)
values (seq.nextval, 'hello', 'world');

注: シーケンスに関するその他のオプション (開始値、増分など) については、Oracle ドキュメントを参照してください。

于 2008-11-25T22:58:43.047 に答える
3

オラクル時代から思い出す限り、TRIGGER を使用せずに Auto Increment 列を実現することはできません。自動インクリメント列を作成するための解決策には、 TRIGGER と SEQUENCE が含まれます(これはすでに知っていると想定しているため、トリガーの発言はありません)。

于 2008-11-25T11:13:17.573 に答える
0

「トリガーベース」のソリューションを本当に使用したくない場合は、プログラムによるアプローチで自動インクリメント機能を実現し、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

于 2010-03-08T11:28:27.353 に答える
0

たとえば、FerranB の回答に加えて
、MySQL での auto_incement の動作とは対照的に、おそらく言及する価値があります。

  • シーケンスはデータベース全体で機能するため、複数のテーブルに使用でき、値はデータベース全体で一意です
  • したがって、テーブルを切り捨てても「自動インクリメント」機能はリセットされません

  • 于 2010-02-05T11:01:29.930 に答える
    -8
    SELECT max (id) + 1 
    FROM   table
    
    于 2008-12-01T12:42:10.280 に答える