sql - 테이블 - 자바 시퀀스




오라클에 sequence.nextval로 테이블을 생성한다. (4)

오라클 12c

이제 다른 많은 데이터베이스와 마찬가지로 IDENTITY 열이 IDENTITY 시퀀스가 자동으로 뒤에서 생성됩니다. 이 솔루션은 이 블로그 게시물에서 볼 수 있듯이 트리거 기반 테스트보다 훨씬 빠릅니다.

따라서 테이블 생성은 다음과 같습니다.

CREATE TABLE qname
(
    qname_id integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL PRIMARY KEY,
    qname    VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
);

오라클 11g 이하

documentation 에 따르면, 당신은 그렇게 할 수 없습니다 :

기본 열 값 제한 DEFAULT 표현식에는 PL / SQL 함수에 대한 참조 나 다른 열인 CURRVAL, NEXTVAL, LEVEL, PRIOR 및 ROWNUM의 가상 열 또는 완전히 지정되지 않은 날짜 상수를 포함 할 수 없습니다.

Oracle에서 "자동 증가"열을 갖는 표준 방법은 트리거를 사용하는 것입니다.

CREATE OR REPLACE TRIGGER my_trigger
  BEFORE INSERT 
  ON qname
  FOR EACH ROW
  -- Optionally restrict this trigger to fire only when really needed
  WHEN (new.qname_id is null)
DECLARE
  v_id qname.qname_id%TYPE;
BEGIN
  -- Select a new value from the sequence into a local variable. As David
  -- commented, this step is optional. You can directly select into :new.qname_id
  SELECT qname_id_seq.nextval INTO v_id FROM DUAL;

  -- :new references the record that you are about to insert into qname. Hence,
  -- you can overwrite the value of :new.qname_id (qname.qname_id) with the value
  -- obtained from your sequence, before inserting
  :new.qname_id := v_id;
END my_trigger;

Oracle TRIGGER 에 대한 자세한 내용은 설명서를 참조하십시오.

이 질문에는 이미 답변이 있습니다.

다음 쿼리를 사용하여 시퀀스를 만들었습니다.

create sequence qname_id_seq start with 1 increment by 1 nocache;

이제 위의 시퀀스를 사용하는 테이블을 만들려고하면 다음과 같은 오류가 발생합니다.

Error report:
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"

나는 다음 쿼리를 사용하여 sequence.nextval을 가진 테이블을 생성했다.

CREATE TABLE qname
(
    qname_id integer NOT NULL default qname_id_seq.nextval PRIMARY KEY,
    qname    VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
);

Oracle 12c에서는 이제 CURRVAL 및 NEXTVAL 시퀀스 가상 컬럼을 컬럼의 기본값으로 지정할 수 있습니다. 또는 ID 열을 사용할 수 있습니다. 만나다:

예를 들어,

CREATE SEQUENCE t1_seq;
CREATE TABLE t1 (
  id          NUMBER DEFAULT t1_seq.NEXTVAL,
  description VARCHAR2(30)
);

나 자신을 위해 나는 Lukas Edger의 솔루션을 선호한다.

그러나 컬럼에 디폴트 값으로 적용 할 수있는 SYS_GUID 함수가 있으며 고유 ID를 생성하고 SYS_GUID 수도 있습니다.

찬반 양론에 대한 자세한 내용은 here


Oracle 12c 에서는 ID 컬럼을 선언 할 수도 있습니다.

CREATE TABLE identity_test_tab (
  id          NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  description VARCHAR2(30)
);

여기 예제 및 성능 테스트 ... 여기서 단락입니다. 결론은 시퀀스 또는 새 ID 열의 직접 사용 이 트리거보다 훨씬 빠릅니다.





plsql