2011-01-27 5 views
19

내가 오라클에서 다음 명령을 실행할 때 문제가 발생하면 오류가 발생합니다.오라클의 테이블을 잘라 내기

Truncate table mytable; 

오류 :

ORA-02266: unique/primary keys in table referenced by enabled foreign keys 

나는이 MYTABLE은 다른 테이블과의 관계를 가지고 있음을 발견했다. 이것이 Truncate 명령이 더 이상 진행될 수없는 이유입니다. Truncate 명령을 사용하여 SQL 스크립트로 myTable에서 데이터를 삭제하는 방법은 무엇입니까?

답변

27

TRUNCATE 문을 DELETE 문으로 전환해야합니다 (느리고 로깅되지만 제약 조건이있는 경우이를 수행하는 방법입니다).

DELETE mytablename; 

문제가있는 테이블을 참조하는 외래 키를 찾거나 일시적으로 사용할 수 없도록 설정할 수 있습니다. pk-of-table 테이블의 기본 키의 이름입니다

select 'ALTER TABLE '||TABLE_NAME||' DISABLE CONSTRAINT '||CONSTRAINT_NAME||';' 
from user_constraints 
where R_CONSTRAINT_NAME='<pk-of-table>'; 

는 실행 위의 쿼리의 출력

을 잘리지. 이 작업이 완료되면 다시 활성화하십시오. DISABLE CONSTRAINTENABLE CONSTRAINT

+0

이 테이블에는 100 만 개가 넘는 레코드가 있으며 삭제를 사용하면 속도가 느려질 수 있으므로 Delete 문을 사용할 수 없습니다. – ppshein

+0

레코드가 1 백만 개가 있다면 잘라내기를 수행하기 전에 연결된 모든 하위 레코드를 제거한다고 가정합니다. – RichardTheKiwi

+0

제약 조건을 해제 할 때 cyberkiwi의 옵션을 따를 것입니다. 이 방법을 사용하면 제약 조건을 삭제하지 않습니다. 이 기사에서 http://psoug.org/reference/truncate.html –

8

으로 변경하십시오. 오류 메시지는 테이블을 참조하는 외래 키 제약 조건이있는 다른 테이블이 있음을 알려줍니다.

Oracle docs

에 따르면 당신은 부모 테이블 활성화 된 외래 키 제약 조건의 을자를 수 없습니다. 테이블을 잘라 내기 전에 제약 조건을 비활성화해야합니다.

syntax for disabling a foreign key은 다음과 같습니다

ALTER 표 TABLE_NAME 제약 constraint_name을 해제; 다음과 같이 많은 제약 많은 행을 삭제하는

0

일반적인 방법은 다음과 같습니다

  • 모든 열이 있지만 제약을하지 않고 mytable_new를 작성 (또는 비활성화 제약 조건을 만들 수);
  • mytable에서 mytable_new까지 필요한 데이터를 복사하십시오.
  • mytable_new에 대한 제약 조건이 모든 것이 정상임을 확인하십시오.
  • 대신 mytable을 참조하여 mytable_new을 참조하는 모든 제약 조건을 변경하고 모든 내용이 정상임을 확인하십시오.
  • drop table mytable.
  • alter table mytable_new rename to mytable.

느린 제약 조건이 많은 백만 개의 레코드를 삭제하는 것보다 훨씬 빠릅니다.

-1

오류 메시지에서 설명한 것처럼 사용 가능한 외래 키에서 참조하는 테이블을자를 수 없습니다. truncate DDL 명령을 사용하려면 먼저 외래 키 제약 조건을 비활성화하고 truncate 명령을 실행 한 다음 다시 활성화하십시오.

참고 :이 페이지는 매우 좋은 솔루션을 제공 Difference between TRUNCATE, DELETE and DROP commands

8

... 나는 여기에서 솔루션 복사있어

ORA-02266: unique/primary keys in table referenced by enabled foreign keys

:

  • 가 활성 참조 된 찾기 외래 키 제약 조건을 설정하고 비활성화합니다.
  • 표를 잘라내거나 삭제하십시오.
  • 텍스트 편집기를 사용하여 .. 당신이 쿼리에서 얻은 출력에서 ​​활성화하려면 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'); 
    
+1

감사합니다. 매우 유용합니다 ... – iceberg

1

오라클 12C introduced a feature는 DELETE 규칙을 갖는 참조 무결성 제약 조건의 부모 테이블을 절단합니다. 대신 truncate table tablename; 사용

:

오라클 truncate table 문서에서
TRUNCATE TABLE tablename CASCADE; 

: 당신이 CASCADE를 지정하면

는, 오라클 데이터베이스가 DELETE CASCADE 참조 제한 조건에서 사용와 테이블을 참조하는 모든 자식 테이블을 자릅니다 . 이 작업은 지정된 옵션을 사용하여 모든 하위 테이블, granchild 테이블 등을 자르는 재귀 적 작업입니다.

0

비슷한 문제가있어서 다음 스크립트로 분류했습니다.

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; 
/

이 스크립트는 먼저 모든 제약 조건을 비활성화합니다. 테이블의 데이터를 절단 한 다음 제한을 활성화합니다.

희망이 있습니다.

환호 ..

0
TRUNCATE TABLE TEST2 DROP ALL STORAGE; 

.table

+0

테이블이 이미 비어 있지 않으면이 기능이 작동하지 않습니다. 재현 가능한 테스트 케이스를 만들 수 있습니까? –

2

문제에 적용되는 외래 키 제약 조건이있을 때이 문장은 실제로 작동합니다

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; 
관련 문제