programing

트리거를 사용하지 않고 Oracle 자동 증가

subpage 2023. 6. 18. 16:00
반응형

트리거를 사용하지 않고 Oracle 자동 증가

트리거를 사용하는 것 외에 오라클에서 자동 증가를 달성하는 다른 방법은 무엇입니까?

오라클 시퀀스를 생성하고 사용할 수 있습니다.구문 및 세부 정보는 http://www.techonthenet.com/oracle/sequences.php 에 있습니다.

또한 다른 RDBMS의 AUTONUMBER와 관련된 제한 사항을 이해하려면 http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html 기사를 읽으십시오.

일련 번호가 필요 없고 고유 ID만 필요한 경우 기본값인 SYS_GUID()를 사용할 수 있습니다.Ie:

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');

하지만 트리거를 사용하는 것이 더 "투명"합니다.

Oracle 시절의 기억으로는 트리거를 사용하지 않으면 자동 증분 열을 얻을 수 없습니다.자동 증분 열을 만들기 위한 솔루션에는 트리거와 시퀀스가 포함됩니다(이미 알고 계시리라 생각합니다. 따라서 트리거 주석 없음).

시퀀스 만들기:

create sequence seq;

그런 다음 값을 추가합니다.

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

참고: 오라클 문서에서 시퀀스에 대한 추가 옵션(시작 값, 증분 등)을 찾습니다.

12c부터는 테이블과 자동 증분 간의 연결을 명시하는 ID 열을 사용할 수 있습니다. 트리거나 시퀀스가 필요하지 않습니다.구문은 다음과 같습니다.

create table <table_name> ( <column_name> generated as identity );

예를 들어.페란B의 대답:
MySQL에서 auto_incement가 작동하는 방식과는 반대로 다음과 같이 언급할 가치가 있습니다.

  • 시퀀스는 데이터베이스 전체에서 작동하므로 여러 테이블에 사용할 수 있으며 값은 전체 데이터베이스에 대해 고유합니다.
  • 따라서: 테이블을 잘라도 '자동 증분' 기능이 재설정되지 않습니다.

  • "트리거 기반" 솔루션을 실제로 사용하지 않으려면 프로그래밍 방식을 사용하여 자동 증분 기능을 달성하고 다음을 사용하여 자동 증분 키의 값을 얻을 수 있습니다.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

    SELECT max (id) + 1 
    FROM   table
    

    언급URL : https://stackoverflow.com/questions/317001/auto-increment-in-oracle-without-using-a-trigger

    반응형