Truncate Cascade – 12c

Por Alex Zaballa ,
Postado em janeiro 2014

No Oracle Database 12c, existe uma nova opção para o comando TRUNCATE, o CASCADE.

Ao contrário de DELETE, o comando TRUNCATE TABLE só altera a High Water Mark da tabela, por isso ele quase não gera UNDO e é instantâneo.

SQL*Plus: Release 12.1.0.1.0 Production on Mon Oct 14 12:51:43 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Advanced Analytics
and Real Application Testing options

SQL> truncate table scott.dept;
truncate table scott.dept
                     *
ERROR at line 1:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys

Buscando a constraint que faz referência a tabela:

SQL> select owner,constraint_name,table_name,delete_rule from dba_constraints where
(r_owner,r_constraint_name) = (select owner,constraint_name from dba_constraints 
where owner='SCOTT' and table_name = 'DEPT' and constraint_type='P');

OWNER     CONSTRAINT_NAME    TABLE_NAME   DELETE_RULE
---------- -------------------- -------------------- --------------------
SCOTT     FK_DEPTNO    EMP            NO ACTION

Verificando dos dados da tabela:

SQL> select * from scott.emp;

     EMPNO ENAME      JOB        MGR   HIREDATE        SAL   COMM DEP
---------- ---------- --------- ----- --------- ---------- ---------- ---
      7369 SMITH      CLERK           7902  17-DEC-80        800        20
      7499 ALLEN      SALESMAN  7698  20-FEB-81       1600        300 30
      7521 WARD       SALESMAN  7698  22-FEB-81       1250        500 30
      7566 JONES      MANAGER  7839  02-APR-81       2975            20
      7654 MARTIN     SALESMAN  7698  28-SEP-81       1250       1400 30
      7698 BLAKE      MANAGER  7839  01-MAY-81       2850            30
      7782 CLARK      MANAGER  7839  09-JUN-81       2450            10
      7788 SCOTT      ANALYST  7566  09-DEC-82       3000            20
      7839 KING       PRESIDENT       17-NOV-81       5000            10
      7844 TURNER     SALESMAN  7698  08-SEP-81       1500            30
      7876 ADAMS      CLERK      7788  12-JAN-83       1100            20
      7900 JAMES      CLERK      7698  03-DEC-81        950            30
      7902 FORD       ANALYST  7566  03-DEC-81       3000            20
      7934 MILLER     CLERK      7782  23-JAN-82       1300            10

14 rows selected.

SQL>

Utilizando o CASCADE:

SQL> truncate table scott.dept cascade; 
 truncate table scott.dept cascade                
 *  ERROR at line 1:  ORA-14705: unique or primary keys referenced by enabled foreign keys in table  
 "SCOTT"."EMP"

O erro acima ocorreu porque a constraint não é do tipo ON DELETE CASCADE.

Iremos mudar o tipo da constraint:

SQL> ALTER TABLE SCOTT.EMP DROP
    CONSTRAINT FK_DEPTNO;    
  Table altered.   
  SQL> ALTER TABLE SCOTT.EMP ADD (  
  CONSTRAINT FK_DEPTNO   
  FOREIGN KEY (DEPTNO) 
    REFERENCES SCOTT.DEPT (DEPTNO) on delete cascade); 
  Table altered.

Executando novamente o comando:

SQL> truncate table scott.dept cascade; 
   Table truncated.

Os dados foram apagados com sucesso:

SQL> select * from scott.dept; 
   no rows selected  
   SQL> select * from scott.emp;   
   no rows selected

Alex Zaballa é DBA e trabalha com Oracle há 14 anos, especialista em Banco de Dados Oracle e formado em Análise de Sistemas. Com sólidos conhecimentos em Banco de Dados e Sistemas operacionais, é certificado OCM Database 11G, bem como outras 110 certificações em produtos da Oracle. Trabalha desde 2007 para a Jupiter em Angola, alocado em um projeto no Ministério das Finanças.