복붙노트

[SQL] 오라클에 sequence.nextval와 테이블을 만들 [중복]

SQL

오라클에 sequence.nextval와 테이블을 만들 [중복]

난 다음 쿼리를 사용하여 시퀀스를 생성,

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

해결법

  1. ==============================

    1.우리는 지금 마지막 순서가 자동으로 생성 된 장면 뒤에있는 경우, 많은 다른 데이터베이스와 같은 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
    );
    

    문서에 따르면, 당신은 할 수 없습니다 :

    오라클이 사용하는 트리거, 예를 들어,이다의 표준 방법은 "자동 증가"열이하는

    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;
    

    문서에서 오라클 트리거에 대한 더 읽기

  2. ==============================

    2.오라클 12C에서 이제 열에 대한 디폴트 값으로 CURRVAL과 NEXTVAL 순서 pseudocolumns를 지정할 수 있습니다. 양자 택일로, 당신은 신원 열을 사용할 수 있습니다; 보다:

    오라클 12C에서 이제 열에 대한 디폴트 값으로 CURRVAL과 NEXTVAL 순서 pseudocolumns를 지정할 수 있습니다. 양자 택일로, 당신은 신원 열을 사용할 수 있습니다; 보다:

    EG,

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

    3.나 자신은 루카스 EDGER의 솔루션을 선호합니다.

    나 자신은 루카스 EDGER의 솔루션을 선호합니다.

    하지만 당신은 열에 대한 기본값으로 적용되는 고유 ID를 생성 할 수있는 기능 SYS_GUID도가 알고 할 수 있습니다.

    여기 장점과 단점에 대한 자세한 내용을보실 수 있습니다

  4. ==============================

    4.당신은 (내 오라클 DB 버전 11) 그렇게 오라클의 SQL 개발자 도구를 사용할 수 있습니다. 테이블을 생성하는 고급 옵션을 선택하고 하단과에서 ID 열 탭을 클릭하는 동안이 열 순서를 선택합니다. 이것은 (트리거와 Squence 대응)는 AUTO_INCREMENT 컬럼을 생성합니다.

    당신은 (내 오라클 DB 버전 11) 그렇게 오라클의 SQL 개발자 도구를 사용할 수 있습니다. 테이블을 생성하는 고급 옵션을 선택하고 하단과에서 ID 열 탭을 클릭하는 동안이 열 순서를 선택합니다. 이것은 (트리거와 Squence 대응)는 AUTO_INCREMENT 컬럼을 생성합니다.

  5. ==============================

    5.오라클 12C에서 당신은 또한 ID 열을 선언 할 수 있습니다

    오라클 12C에서 당신은 또한 ID 열을 선언 할 수 있습니다

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

    반바지입니다 예 및 성능 테스트는 여기에 ... 결론은 순서 또는 새로운 정체성 컬럼의 직접 사용이 훨씬 빠른 트리거보다 때문이다.

  6. from https://stackoverflow.com/questions/10613846/create-table-with-sequence-nextval-in-oracle by cc-by-sa and MIT license