source

비어 있지 않은 오라클의 기존 테이블에 자동 증분 ID를 추가하는 중

lovecheck 2023. 7. 21. 21:42
반응형

비어 있지 않은 오라클의 기존 테이블에 자동 증분 ID를 추가하는 중

기존 오라클 테이블에 ID 열을 추가하려면 어떻게 해야 합니까?저는 오라클 11g를 사용하고 있습니다.DEGREE라는 테이블이 있는데 여기에 ID 열을 추가한다고 가정합니다.

FYI 테이블이 비어 있지 않습니다.

한 단계로 수행할 수 없습니다.대신,

  • 테이블을 변경하고 열을 추가합니다(기본 키 제약 조건 없음).

    ALTER TABLE DEGREE ADD (Ident NUMBER(10));
    
  • 새 열을 기본 키 제약 조건(null이 아닌 고유한/null)을 충족하는 데이터로 채웁니다.

    UPDATE DEGREE SET Ident=ROWNUM;
    
  • 테이블을 변경하고 열에 제약 조건 추가

    ALTER TABLE DEGREE MODIFY (Ident PRIMARY KEY);
    

이 작업이 완료된 후 다음을 설정할 수 있습니다.SEQUENCE그리고 aBEFORE INSERT트리거 - 새 레코드의 ID 값을 자동으로 설정합니다.

Oracle 12c에서는 ID 열을 사용합니다.

예를 들어, 테이블이 호출되었다고 가정합니다.demo3개의 열과 100개의 행이 있습니다.

create table demo (col1, col2, col3)
as
select dbms_random.value(1,10), dbms_random.value(1,10), dbms_random.value(1,10)
from   dual connect by rownum <= 100;

다음을 사용하여 ID 열을 추가할 수 있습니다.

alter table demo add demo_id integer generated by default on null as identity;

update demo set demo_id = rownum;

그런 다음 데이터와 일치하도록 내부 시퀀스를 재설정하고 수동 삽입을 방지합니다.

alter table demo modify demo_id generated always as identity start with limit value;

기본 키로 정의합니다.

alter table demo add constraint demo_pk primary key (demo_id);

이렇게 하면 새 열이 열 목록의 끝에 남게 되는데, 이 열은 일반적으로 중요하지 않지만(열 수가 많고 행 체인 문제가 있는 테이블은 제외) 테이블을 설명할 때 이상하게 보입니다.그러나 보이지 않는/보이는 해킹을 사용하여 사전 순서를 정리할 수 있습니다.

SQL> desc demo
 Name                             Null?    Type
 -------------------------------- -------- ----------------------
 COL1                                      NUMBER
 COL2                                      NUMBER
 COL3                                      NUMBER
 DEMO_ID                          NOT NULL NUMBER(38)

begin
    for r in (
        select column_name from user_tab_columns c
        where  c.table_name = 'DEMO'
        and    c.column_name <> 'DEMO_ID'
        order by c.column_id
    )
    loop
        execute immediate 'alter table demo modify '||r.column_name||' invisible';
        execute immediate 'alter table demo modify '||r.column_name||' visible';
    end loop;
end;
/

SQL> desc demo
 Name                             Null?    Type
 -------------------------------- -------- ----------------------
 DEMO_ID                          NOT NULL NUMBER(38)
 COL1                                      NUMBER
 COL2                                      NUMBER
 COL3                                      NUMBER

(오라클 18.0 기준) 한 가지 할 수 없는 것은 기존 열을 변경하여 ID 열로 만드는 것입니다. 따라서 위와 같은 과정을 거쳐야 하지만 기존 값을 복사하여 이전 열을 삭제할 수 있습니다.또는 ID 열을 사용하여 새 테이블을 명시적으로 정의하고 별도의 단계에서 데이터를 복사합니다.그렇지 않으면 다음을 얻을 수 있습니다.

-- DEMO_ID column exists but is currently not an identity column:
alter table demo modify demo_id generated by default on null as identity start with limit value;

-- Fails with:
ORA-30673: column to be modified is not an identity column 
  1. 열을 추가합니다.

    alter table table_name add (id INTEGER);

  2. 시퀀스를 생성합니다.table_name_id_seq와 함께start with절, 표의 행 수 + 1 또는 다른 안전 값 사용(중복 ID는 원하지 않음);

  3. 테이블 잠금(삽입 없음)

    alter table table_name lock exclusive mode;

  4. 칸을 채우다

    update table_name set id = rownum; --or another logic

  5. 시퀀스를 사용하여 자동으로 ID를 삽입하기 위한 트리거 추가(인터넷에서 예제를 찾을 수 있습니다. 를 들어 이 답변

생성 트리거를 실행하면 잠금이 해제됩니다.(자동으로 커밋됨).또한 id 열에 고유 제약 조건을 추가할 수도 있습니다. 그렇게 하는 것이 가장 좋습니다.

Oracle의 경우:

CREATE TABLE new_table AS (SELECT ROWNUM AS id, ta.* FROM old_table ta)

이 ID 열은 자동으로 증분되지 않습니다.

언급URL : https://stackoverflow.com/questions/23102958/adding-auto-increment-identity-to-existing-table-in-oracle-which-is-not-empty

반응형