비어 있지 않은 오라클의 기존 테이블에 자동 증분 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 열을 사용합니다.
예를 들어, 테이블이 호출되었다고 가정합니다.demo
3개의 열과 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
열을 추가합니다.
alter table table_name add (id INTEGER);
시퀀스를 생성합니다.
table_name_id_seq
와 함께start with
절, 표의 행 수 + 1 또는 다른 안전 값 사용(중복 ID는 원하지 않음);테이블 잠금(삽입 없음)
alter table table_name lock exclusive mode;
칸을 채우다
update table_name set id = rownum; --or another logic
시퀀스를 사용하여 자동으로 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
'source' 카테고리의 다른 글
Oracle에서 마지막으로 실행된 SQL 문을 가져오고 변수 값을 바인딩하는 방법 (0) | 2023.07.21 |
---|---|
Spring Boot 2 - 콩이 초기화되기 전에 조치를 취합니다. (0) | 2023.07.21 |
Python에서 집합을 초기화하기 위해 물결 괄호 사용 (0) | 2023.07.21 |
SQL DateTime에 대한 링크 값은 로컬(Kind=Unspecified)입니다. UTC로 만들려면 어떻게 해야 합니까? (0) | 2023.07.21 |
ORA-00980 동의어 변환은 PLSQL에서 더 이상 유효하지 않습니다. (0) | 2023.07.21 |