복붙노트

[SQL] 어떻게 테이블에서 최대 값을 가지는 오라클 시퀀스 시작을 만드는 방법?

SQL

어떻게 테이블에서 최대 값을 가지는 오라클 시퀀스 시작을 만드는 방법?

특정 테이블에서 최대 값으로 시작 오라클에서 시퀀스를 만들려고. 왜이 작동하지 않는 이유는 무엇입니까?

CREATE SEQUENCE transaction_sequence
  MINVALUE 0
  START WITH (SELECT MAX(trans_seq_no)
     FROM TRANSACTION_LOG) 
  INCREMENT BY 1
  CACHE 20;

해결법

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

    1.당신은 + 1 최대 (trans_seq_no)로 시작 할 수 있습니다.

    당신은 + 1 최대 (trans_seq_no)로 시작 할 수 있습니다.

    손목 시계:

    SQL> create table my_numbers(my_number number not null primary key);
    
    Table created.
    
    SQL> insert into my_numbers(select rownum from user_objects);
    
    260 rows created.
    
    SQL> select max(my_number) from my_numbers;
    
    MAX(MY_NUMBER)
    --------------
               260
    
    SQL> create sequence my_number_sn start with 260;
    
    Sequence created.
    
    SQL> insert into my_numbers(my_number) values (my_number_sn.NEXTVAL);
    insert into my_numbers(my_number) values (my_number_sn.NEXTVAL)
    *
    ERROR at line 1:
    ORA-00001: unique constraint (NEIL.SYS_C00102439) violated
    

    당신이 숫자로 순서를 만들 때, 당신은 당신이 순서에 대해 선택 처음으로, 오라클은 당신이 그것을 할당하는 초기 값을 반환 할 것을 기억해야합니다.

    SQL> drop sequence my_number_sn;
    
    Sequence dropped.
    
    SQL> create sequence my_number_sn start with 261;
    
    Sequence created.
    
    SQL>  insert into my_numbers(my_number) values (my_number_sn.NEXTVAL);
    
    1 row created.
    

    당신은 '끊김없는'일을하려는 경우, 난 강력에 조언

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

    2.당신은 PL / SQL을 사용하는 경우, (편집 : 다음으로 높은 값으로 시작하는 닐의 xlnt 제안을 포함) 시도 :

    당신은 PL / SQL을 사용하는 경우, (편집 : 다음으로 높은 값으로 시작하는 닐의 xlnt 제안을 포함) 시도 :

    SELECT 'CREATE SEQUENCE transaction_sequence MINVALUE 0 START WITH '||MAX(trans_seq_no)+1||' INCREMENT BY 1 CACHE 20'
      INTO v_sql
      FROM transaction_log;
    
    EXECUTE IMMEDIATE v_sql;
    

    또 다른 점은 고려해야 할 데이터베이스가 다운되면 20 캐시 매개 변수를 설정하여, 당신은 당신의 순서 (19 개) 값까지 손실의 위험을 실행합니다. 캐시 값은 데이터베이스가 다시 시작 손실됩니다. 당신은 매우 자주 순서를 치는 것, 또는, 당신이 차이에 대해 그렇게 많이 상관 없어하지 않는 한, 나는 1로 설정 것입니다.

    마지막으로 니트 : 당신은 캐시와 INCREMENT BY에 지정된 값은 기본값입니다. 당신은 그것을 생략 할 수도 있고, 같은 결과를 얻을 수 있습니다.

  3. ==============================

    3.여기에 내가 잘 작동 나의 예를 :

    여기에 내가 잘 작동 나의 예를 :

    declare
     ex number;
    begin
      select MAX(MAX_FK_ID)  + 1 into ex from TABLE;
      If ex > 0 then
        begin
                execute immediate 'DROP SEQUENCE SQ_NAME';
          exception when others then
            null;
        end;
        execute immediate 'CREATE SEQUENCE SQ_NAME INCREMENT BY 1 START WITH ' || ex || ' NOCYCLE CACHE 20 NOORDER';
      end if;
    end;
    
  4. ==============================

    4.A는 SEQUENCE 문을 CREATE 안에 당신은 부속을 사용할 수 없습니다. 당신은 미리 값을 선택해야합니다.

    A는 SEQUENCE 문을 CREATE 안에 당신은 부속을 사용할 수 없습니다. 당신은 미리 값을 선택해야합니다.

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

    5.중반 곰은 MAX 값은 커밋 된 값의 최대 될 것입니다. 그것은 1234 반환 할 수 있습니다, 당신은 누군가가 이미 1235을 삽입 되었으나 확정되지 않았 음을 고려할 필요가있다.

    중반 곰은 MAX 값은 커밋 된 값의 최대 될 것입니다. 그것은 1234 반환 할 수 있습니다, 당신은 누군가가 이미 1235을 삽입 되었으나 확정되지 않았 음을 고려할 필요가있다.

  6. ==============================

    6.적은 코드와 간단한와 이반 Laharnar 기준 자료 :

    적은 코드와 간단한와 이반 Laharnar 기준 자료 :

    declare
        lastSeq number;
    begin
        SELECT MAX(ID) + 1 INTO lastSeq FROM <TABLE_NAME>;
        if lastSeq IS NULL then lastSeq := 1; end if;
        execute immediate 'CREATE SEQUENCE <SEQUENCE_NAME> INCREMENT BY 1 START WITH ' || lastSeq || ' MAXVALUE 999999999 MINVALUE 1 NOCACHE';
    end;
    
  7. ==============================

    7.

    DECLARE
        v_max NUMBER;
    BEGIN
        SELECT (NVL (MAX (<COLUMN_NAME>), 0) + 1) INTO v_max FROM <TABLE_NAME>;
        EXECUTE IMMEDIATE 'CREATE SEQUENCE <SEQUENCE_NAME> INCREMENT BY 1 START WITH ' || v_max || ' NOCYCLE CACHE 20 NOORDER';
    END;
    
  8. ==============================

    8.동적 SQL을 사용

    동적 SQL을 사용

    BEGIN
                DECLARE
                maxId NUMBER;
                  BEGIN
                  SELECT MAX(id)+1
                  INTO maxId
                  FROM table_name;          
                  execute immediate('CREATE SEQUENCE sequane_name MINVALUE '||maxId||' START WITH '||maxId||' INCREMENT BY 1 NOCACHE NOCYCLE');
                  END;
    END;
    
  9. from https://stackoverflow.com/questions/798766/how-to-create-an-oracle-sequence-starting-with-max-value-from-a-table by cc-by-sa and MIT license