트리거를 사용하지 않고 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
'programing' 카테고리의 다른 글
| R 산점도에서 점의 크기를 제어하시겠습니까? (0) | 2023.06.18 |
|---|---|
| 변수 쌓기 대힙 변수 (0) | 2023.06.18 |
| 로컬 XML 파일에서 테이블로 데이터를 로드할 때 MariaDB node.js 스크립트에서 ER_LOCAL_INFILE_WRONG_FILENAME 오류가 발생함 (0) | 2023.06.18 |
| django.db.migrations.exceptions.일관성 없는 마이그레이션역사 (0) | 2023.06.18 |
| C/C++: do-while(0)을 사용하는 방법; C4127과 같은 컴파일러 경고 없이 구성? (0) | 2023.06.13 |