Усеченная таблица в Oracle получает ошибки - PullRequest
23 голосов
/ 27 января 2011

У меня проблема в том, что когда я запускаю следующую команду в Oracle, я сталкиваюсь с ошибкой.

Truncate table mytable;

Ошибка:

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

Я обнаружил, что этот mytable связан с другими таблицами. Вот почему команда усечения больше не может продолжаться. Как удалить данные из myTable с помощью сценариев SQL с помощью команды Truncate?

Ответы [ 9 ]

35 голосов
/ 27 января 2011

Вы должны поменять оператор 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

8 голосов
/ 02 февраля 2015

эта страница предлагает очень хорошее решение ...

ORA-02266: уникальные / первичные ключи в таблице, на которые ссылаются включенные внешние ключи

Я тут копирую с него Решение:

  • Найдите ссылочные ограничения внешнего ключа ENABLED и отключите их.
  • усечение / удаление из таблицы.
  • с использованием любого текстового редактора ... просто измените отключить, чтобы включить в выводе, полученном из запроса, а затем запустите его.

    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');
    
8 голосов
/ 27 января 2011

В сообщении об ошибке сообщается, что существуют другие таблицы с ограничением внешнего ключа, относящиеся к вашей таблице.

Согласно документам Oracle 1004 *

Нельзя обрезать родительскую таблицу с включенным ограничением внешнего ключа.Вы должны отключить ограничение перед усечением таблицы.

Синтаксис для отключения внешнего ключа :

ALTER TABLE table_name disable CONSTRAINT constraint_name;

2 голосов
/ 06 февраля 2018

Проблема:

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;
1 голос
/ 28 июня 2016

Oracle 12c представила функцию для усечения таблицы, которая является родителем ограничения ссылочной целостности, имеющего правило ON DELETE.

Вместо truncate table tablename; используйте:

TRUNCATE TABLE tablename CASCADE;

Из Oracle truncate table документация:

Если вы укажете CASCADE, Oracle Database усекает все дочерние таблицы, ссылающиеся на таблицу, с включенным ссылочным ограничением ON DELETE CASCADE. Это рекурсивная операция, которая усекает все дочерние таблицы, таблицы гранчил и т. Д. С использованием указанных параметров.

0 голосов
/ 01 декабря 2017
TRUNCATE TABLE TEST2 DROP ALL STORAGE;

Этот оператор на самом деле работает, когда к .table

применено ограничение внешнего ключа.
0 голосов
/ 05 июля 2017

У меня была похожая проблема, и я разобрался с помощью следующих сценариев.

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 голосов
/ 27 января 2011

Как указано в сообщении об ошибке, вы не можете усечь таблицу, на которую ссылаются включенные внешние ключи.Если вы действительно хотите использовать команду truncate DDL, сначала отключите ограничение внешнего ключа, запустите команду truncate и включите ее снова.

Ссылка: Разница между командами TRUNCATE, DELETE и DROP

0 голосов
/ 27 января 2011

Типичный подход для удаления многих строк со многими ограничениями заключается в следующем:

  • создать mytable_new со всеми столбцами, но без ограничений (или отключить создание ограничений);
  • скопируйте все необходимые данные из mytable в mytable_new.
  • включите ограничения для mytable_new, чтобы убедиться, что все в порядке.
  • измените все ограничения, которые ссылаются mytable на ссылку *Вместо 1015 * и увидите, что все в порядке.
  • drop table mytable.
  • alter table mytable_new rename to mytable.

Это гораздо быстрее, чем удаление миллиона записей с большим количеством медленныхограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...