2011-01-27 15 views
19

Tengo el problema es cuando ejecuto el siguiente comando en Oracle, encuentro el error.Tabla truncada en Oracle recibiendo errores

Truncate table mytable; 

Errores:

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

me encontré con que, esta mitabla tiene relación con otras tablas. Es por eso que el comando Truncar no puede continuar. ¿Cómo eliminar datos de myTable con los scripts SQL usando el comando Truncar?

Respuesta

27

Tiene que intercambiar la instrucción TRUNCATE por DELETE, más lenta y registrada, pero esa es la manera de hacerlo cuando existen restricciones.

DELETE mytablename; 

O eso, o se pueden encontrar las claves externas que hacen referencia a la tabla en cuestión y desactivar temporalmente.

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

Dónde pk-of-table es el nombre de la clave primaria de la tabla que se está truncado

Ejecutar la salida de la consulta anterior. Cuando se haya hecho esto, recuerde habilitarlos de nuevo, simplemente cambie DISABLE CONSTRAINT en ENABLE CONSTRAINT

+0

No puedo usar instrucciones Delete porque esta tabla tiene más de un millón de registros y sería lenta si uso delete. – ppshein

+0

Si tiene 1 millón de registros, ¿supongo que está eliminando todos los registros secundarios que están vinculados antes de realizar el truncamiento? – RichardTheKiwi

+0

Seguiría la opción de cyberkiwi para desactivar las restricciones. De esta forma no estás eliminando restricciones. Eche un vistazo a este artículo yendo más en detalle sobre el comportamiento de truncar http://psoug.org/reference/truncate.html –

8

El mensaje de error le indica que hay otras tablas con una restricción de clave externa que hace referencia a su tabla.

De acuerdo con la Oracle docs

No se puede truncar la tabla primaria de una restricción de clave externa habilitada. Debe deshabilitar la restricción antes de truncar la tabla.

El syntax for disabling a foreign key es:

ALTER TABLE nombre_tabla desactivar CONSTRAINT;

0

Un enfoque típico para eliminar tantas filas con muchas limitaciones es la siguiente:

  • crear mytable_new con todas las columnas, pero sin limitaciones (o crear restricciones discapacitados);
  • copie los datos que necesite desde mytable hasta .
  • habilita las restricciones en mytable_new para ver que todo está bien.
  • modifique las restricciones que hacen referencia a mytable para hacer referencia a mytable_new y vea que todo está correcto.
  • drop table mytable.
  • alter table mytable_new rename to mytable.

Es mucho más rápido que eliminar un millón de registros con muchas restricciones lentas.

-1

Como se menciona en el mensaje de error, no se puede truncar una tabla a la que hacen referencia las claves externas habilitadas. Si realmente desea utilizar el comando truncate DDL, primero desactive la restricción de clave externa, ejecute el comando truncar y vuelva a habilitarlo.

Referencia: Difference between TRUNCATE, DELETE and DROP commands

8

esta página ofrece una solución muy buena ...

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

Estoy aquí copia de él la solución:

  • encontrar el referenciado ACTIVADO restricciones de clave externa y deshabilitarlas.
  • truncar/eliminar de la tabla.
  • usando cualquier editor de texto .. simplemente cambie la deshabilitación para habilitarla en la salida que obtiene de la consulta, luego ejecútela.

    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

gracias. muy útil ... – iceberg

1

Oracle 12c introduced a feature para truncar una tabla que es un padre de una restricción de integridad referencial que tenía en regla de supresión.

En lugar de truncate table tablename; uso:

TRUNCATE TABLE tablename CASCADE; 

De Oracle truncate table documentación:

Si especifica CASCADE, a continuación, base de datos Oracle trunca todas las tablas secundarias que hacen referencia a la tabla con una habilitado ON DELETE CASCADE restricción referencial . Esta es una operación recursiva que truncará todas las tablas secundarias, tablas de elementos secundarios, etc., utilizando las opciones especificadas.

0

Tuve un problema similar y lo resolví con los siguientes scripts.

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

Este script primero deshabilitará todas las restricciones. Trunca los datos en las tablas y luego habilita las contraints.

Espero que ayude.

aplausos ..

0
TRUNCATE TABLE TEST2 DROP ALL STORAGE; 

Esta declaración realmente funciona cuando hay una restricción de clave externa aplicada sobre una .table

+0

Esto no funciona para mí a menos que las tablas ya estén vacías. ¿Puedes crear un caso de prueba reproducible? –

2

Edición:

Error “ORA-02266: unique/primary keys in table referenced by enabled foreign keys” when trying to truncate a table. 

mensaje de error:

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 

Solución: - Encuentra las restricciones de clave foránea a las que se hace referencia.

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; 

- Desactivar ellos

alter table SCHEMA_NAME.TABLE_NAME_ATTACHMENT disable constraint CONSTRAINT_NAME; 
alter table SCHEMA_NAME.TABLE_NAME_LOCATION disable constraint CONSTRAINT_NAME; 

- Ejecutar el truncado

SQL> truncate table TABLE_NAME; 

Table truncated. 

- Habilitar las claves externas de espalda

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; 

- Permitirles

alter table SCHEMA_NAME.TABLE_NAME_ATTACHMENT enable constraint CONSTRAINT_NAME; 
alter table SCHEMA_NAME.TABLE_NAME_LOCATION enable constraint CONSTRAINT_NAME; 
Cuestiones relacionadas