Oracle에서 테이블 잘라내기 오류 발생
문제는 Oracle에서 다음 명령을 실행하면 오류가 발생한다는 것입니다.
Truncate table mytable;
오류:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys
이 마이테이블이 다른 테이블과 관련이 있다는 걸 알았어요.그렇기 때문에 잘라내기 명령을 더 이상 진행할 수 없습니다.잘라내기 명령을 사용하여 SQL 스크립트를 사용하여 myTable에서 데이터를 삭제하는 방법은 무엇입니까?
TRUNCATE 문을 DELETE 문으로 전환해야 합니다. 속도가 느리고 로그가 기록되지만 제약 조건이 충족되면 그렇게 해야 합니다.
DELETE mytablename;
또는 해당 테이블을 참조하고 있는 외부 키를 검색하여 일시적으로 비활성화할 수 있습니다.
select 'ALTER TABLE '||TABLE_NAME||' DISABLE CONSTRAINT '||CONSTRAINT_NAME||';'
from user_constraints
where R_CONSTRAINT_NAME='<pk-of-table>';
어디에pk-of-table잘리는 테이블의 프라이머리 키 이름입니다.
위 쿼리의 출력을 실행합니다.이 작업이 완료되면 다시 활성화해야 합니다.변경만 하면 됩니다.DISABLE CONSTRAINT안으로ENABLE CONSTRAINT
이 페이지는 매우 좋은 해결책을 제공합니다.
ORA-02266: 활성화된 외부 키에 의해 참조되는 테이블 내의 고유 키/프라이머리 키
여기서 솔루션을 복사하고 있습니다.
- 참조된 ENABLED 외부 키 제약 조건을 찾아 비활성화합니다.
- 테이블에서 잘라내거나 삭제합니다.
텍스트 편집기를 사용합니다.just change disable을 사용하여 쿼리에서 얻은 출력을 활성화한 후 실행합니다.
select 'alter table '||a.owner||'.'||a.table_name||' disable constraint '||a.constraint_name||';' from all_constraints a, all_constraints b where a.constraint_type = 'R' and a.status='ENABLED' and a.r_constraint_name = b.constraint_name and a.r_owner = b.owner and b.table_name = upper('YOUR_TABLE');
에러 메세지는, 테이블을 참조하고 있는 외부 키 제약이 있는 다른 테이블이 있는 것을 나타내고 있습니다.
Oracle 문서에 따르면
활성화된 외부 키 제약 조건의 부모 테이블을 잘라낼 수 없습니다.테이블을 잘라내기 전에 구속조건을 비활성화해야 합니다.
외부 키를 디세블로 하는 구문은 다음과 같습니다.
ALTER TABLE_name이(가) 구속조건을 비활성화합니다.
문제:
Error “ORA-02266: unique/primary keys in table referenced by enabled foreign keys” when trying to truncate a table.
오류 메시지:
SQL> truncate table TABLE_NAME;
truncate table TABLE_NAME
*
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys
해결책: -- 참조된 외부 키 제약 조건을 찾습니다.
SQL> select 'alter table '||a.owner||'.'||a.table_name||' disable constraint '||a.constraint_name||';'
2 from all_constraints a, all_constraints b
3 where a.constraint_type = 'R'
4 and a.r_constraint_name = b.constraint_name
5 and a.r_owner = b.owner
6 and b.table_name = 'TABLE_NAME';
'ALTER TABLE'||A.OWNER||'.'||A.TABLE_NAME||'DISABLE CONSTRAINT'||A.CONSTRAINT_NAME||';'
---------------------------------------------------------------------------------------------------------
alter table SCHEMA_NAME.TABLE_NAME_ATTACHMENT disable constraint CONSTRAINT_NAME;
alter table SCHEMA_NAME.TABLE_NAME_LOCATION disable constraint CONSTRAINT_NAME;
-- 무효로 합니다.
alter table SCHEMA_NAME.TABLE_NAME_ATTACHMENT disable constraint CONSTRAINT_NAME;
alter table SCHEMA_NAME.TABLE_NAME_LOCATION disable constraint CONSTRAINT_NAME;
-- 잘라내기 실행
SQL> truncate table TABLE_NAME;
Table truncated.
-- 외부 키를 다시 유효하게 합니다.
SQL> select 'alter table '||a.owner||'.'||a.table_name||' enable constraint '||a.constraint_name||';'
2 from all_constraints a, all_constraints b
3 where a.constraint_type = 'R'
4 and a.r_constraint_name = b.constraint_name
5 and a.r_owner = b.owner
6 and b.table_name = 'TABLE_NAME';
'ALTER TABLE'||A.OWNER||'.'||A.TABLE_NAME||'ENABLE CONSTRAINT'||A.CONSTRAINT_NAME||';'
--------------------------------------------------------------------------------
alter table SCHEMA_NAME.TABLE_NAME_ATTACHMENT enable constraint CONSTRAINT_NAME;
alter table SCHEMA_NAME.TABLE_NAME_LOCATION enable constraint CONSTRAINT_NAME;
--이네이블화
alter table SCHEMA_NAME.TABLE_NAME_ATTACHMENT enable constraint CONSTRAINT_NAME;
alter table SCHEMA_NAME.TABLE_NAME_LOCATION enable constraint CONSTRAINT_NAME;
Oracle 12c는 ON DELETE 규칙을 가진 참조 무결성 제약 조건의 상위 테이블을 잘라내는 기능을 도입했습니다.
대신truncate table tablename;용도:
TRUNCATE TABLE tablename CASCADE;
Oracle 문서:
CASCADE를 지정하면 Oracle Database는 ON DELETE CASCADE 참조 제약 조건이 활성화된 테이블을 참조하는 모든 하위 테이블을 잘라냅니다.이 작업은 지정된 옵션을 사용하여 모든 하위 테이블, Granchild 테이블 등을 잘라내는 재귀 작업입니다.
제약 조건이 많은 행을 많이 삭제하는 일반적인 방법은 다음과 같습니다.
mytable_new모든 열이 구속되지 않은 상태(또는 구속조건을 생성하지 않음);- 한 이든 베끼다
mytable로로 합니다.mytable_new. - 을 유효하게 하다
mytable_new모든 게 괜찮은지 보려고요 - 하는 제약 조건을 변경하다
mytablemytable_new모든 게 괜찮은지 확인하세요 drop table mytable.alter table mytable_new rename to mytable.
느린 제약이 많은 백만 개의 레코드를 삭제하는 것보다 훨씬 빠릅니다.
비슷한 문제가 있어서 다음 대본으로 정리했습니다.
begin
for i in (select constraint_name, table_name from user_constraints a where a.owner='OWNER' and a.table_name not in
(select b.table_name from user_constraints b where b.table_name like '%BIN%')
and a.constraint_type not in 'P')
LOOP
execute immediate 'alter table '||i.table_name||' disable constraint '||i.constraint_name||'';
end loop;
end;
/
truncate table TABLE_1;
truncate table TABLE_2;
begin
for i in (select constraint_name, table_name from user_constraints a where a.owner='OWNER' and a.table_name not in
(select b.table_name from user_constraints b where b.table_name like '%BIN%')
and a.constraint_type not in 'P')
LOOP
execute immediate 'alter table '||i.table_name||' enable constraint '||i.constraint_name||'';
end loop;
end;
/
이 스크립트는 먼저 모든 구속조건을 비활성화합니다.테이블 내의 데이터를 잘라낸 후 제약을 활성화합니다.
도움이 됐으면 좋겠다.
건배..
TRUNCATE TABLE TEST2 DROP ALL STORAGE;
이 문장은 .table에 외부 키 제약이 적용되는 경우 실제로 작동합니다.
에러 메세지에 기재되어 있듯이, 유효하게 되어 있는 외부 키에 의해서 참조되고 있는 테이블은 잘라낼 수 없습니다.는,truncateDDL 명령어를 사용하여 먼저 외부 키 제약을 디세블로 하고 truncate 명령을 실행한 후 다시 이니블로 합니다.
참조: TRUNCATE, DELETE 및 DROP 명령어의 차이점
언급URL : https://stackoverflow.com/questions/4812146/truncate-table-in-oracle-getting-errors
'programing' 카테고리의 다른 글
| Node.js에 JSON 개체의 콘텐츠를 기록하려면 어떻게 해야 합니까? (0) | 2023.02.28 |
|---|---|
| JSON 문자열을 사전으로 변환하는 방법 (0) | 2023.02.28 |
| HTML을 WordPress Woocommerce 단일 제품 페이지에 통합하는 방법 (0) | 2023.02.28 |
| 필드 유형을 변경하려면 어떻게 해야 합니다. (0) | 2023.02.28 |
| ASP에서 JSON 개체를 반환하는 중입니다.NET 페이지 (0) | 2023.02.28 |