[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 최대 (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.당신은 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.여기에 내가 잘 작동 나의 예를 :
여기에 내가 잘 작동 나의 예를 :
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.A는 SEQUENCE 문을 CREATE 안에 당신은 부속을 사용할 수 없습니다. 당신은 미리 값을 선택해야합니다.
A는 SEQUENCE 문을 CREATE 안에 당신은 부속을 사용할 수 없습니다. 당신은 미리 값을 선택해야합니다.
-
==============================
5.중반 곰은 MAX 값은 커밋 된 값의 최대 될 것입니다. 그것은 1234 반환 할 수 있습니다, 당신은 누군가가 이미 1235을 삽입 되었으나 확정되지 않았 음을 고려할 필요가있다.
중반 곰은 MAX 값은 커밋 된 값의 최대 될 것입니다. 그것은 1234 반환 할 수 있습니다, 당신은 누군가가 이미 1235을 삽입 되었으나 확정되지 않았 음을 고려할 필요가있다.
-
==============================
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.
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.동적 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;
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
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 내에서 와일드 카드를 사용하여 (0) | 2020.06.05 |
---|---|
[SQL] 어떤 SQL 문은 빠르다? (대 WHERE 음 ...) (0) | 2020.06.05 |
[SQL] 는 SQL Server의 알터 사용자 정의 유형 (0) | 2020.06.05 |
[SQL] 없는 그룹에 의해 SQL에서 열을 선택합니다 (0) | 2020.06.05 |
[SQL] 경고 : NULL 값은 아쿠아 데이터 스튜디오에서 집계 또는 다른 SET 연산에 의해 제거 (0) | 2020.06.05 |