Ich habe das Problem, wenn ich den folgenden Befehl in Oracle ausführte, stoße ich auf den Fehler.
Truncate table mytable;
Fehler:
ORA-02266: unique/primary keys in table referenced by enabled foreign keys
Ich habe festgestellt, dass dieser Mytable eine Beziehung zu anderen Tabellen hat. Deshalb kann der Befehl Abschneiden nicht mehr fortgesetzt werden. Wie lösche ich Daten aus myTable mit den SQL-Skripten mit dem Befehl Abschneiden?
Sie müssen die TRUNCATE-Anweisung langsamer und protokolliert in DELETE-Anweisungen austauschen. Dies ist jedoch der Fall, wenn Einschränkungen vorhanden sind.
DELETE mytablename;
Entweder das oder Sie können die Fremdschlüssel finden, die auf die betreffende Tabelle verweisen, und sie vorübergehend deaktivieren.
select 'ALTER TABLE '||TABLE_NAME||' DISABLE CONSTRAINT '||CONSTRAINT_NAME||';'
from user_constraints
where R_CONSTRAINT_NAME='<pk-of-table>';
Wobei pk-of-table
der Name des Primärschlüssels der Tabelle ist, die gekürzt wird
Führen Sie die Ausgabe der obigen Abfrage aus. Wenn dies geschehen ist, denken Sie daran, sie erneut zu aktivieren. Ändern Sie einfach DISABLE CONSTRAINT
in ENABLE CONSTRAINT
.
diese Seite bietet eine sehr gute Lösung ...
Ich kopiere hier die Lösung:
verwenden Sie einen beliebigen Texteditor. Ändern Sie einfach "disable", um die Ausgabe zu aktivieren, die Sie von der Abfrage erhalten, und führen Sie sie aus.
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');
In der Fehlermeldung erfahren Sie, dass es andere Tabellen mit einer Fremdschlüsseleinschränkung gibt, die auf Ihre Tabelle verweist.
Nach den Oracle-Dokumenten
Sie können die übergeordnete Tabelle nicht abschneiden einer aktivierten Fremdschlüsseleinschränkung . Sie müssen die Einschränkung vor .__ deaktivieren. die Tabelle abschneiden.
Die -Syntax zum Deaktivieren eines Fremdschlüssels lautet:
ALTER TABLE Tabellenname deaktivieren CONSTRAINT constraint_name;
Problem:
Error “ORA-02266: unique/primary keys in table referenced by enabled foreign keys” when trying to truncate a table.
Fehlermeldung:
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
Lösung: -- Finden Sie die referenzierten Fremdschlüsseleinschränkungen.
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;
- Deaktiviere sie
alter table SCHEMA_NAME.TABLE_NAME_ATTACHMENT disable constraint CONSTRAINT_NAME;
alter table SCHEMA_NAME.TABLE_NAME_LOCATION disable constraint CONSTRAINT_NAME;
- Führe das abgeschnittene aus
SQL> truncate table TABLE_NAME;
Table truncated.
- Aktivieren Sie die Fremdschlüssel wieder
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;
-- Aktiviere sie
alter table SCHEMA_NAME.TABLE_NAME_ATTACHMENT enable constraint CONSTRAINT_NAME;
alter table SCHEMA_NAME.TABLE_NAME_LOCATION enable constraint CONSTRAINT_NAME;
Oracle 12c führte ein Feature ein, um eine Tabelle abzuschneiden, die eine übergeordnete Einschränkung einer referentiellen Integrität mit der ON DELETE-Regel ist.
Anstelle von truncate table tablename;
verwenden Sie:
TRUNCATE TABLE tablename CASCADE;
Aus der Oracle truncate table
Dokumentation:
Wenn Sie CASCADE angeben, kürzt Oracle Database alle untergeordneten Tabellen, die auf eine Tabelle verweisen, mit der aktivierten referenziellen ON DELETE CASCADE-Einschränkung. Dies ist eine rekursive Operation, bei der alle untergeordneten Tabellen, Granchild-Tabellen usw. mit den angegebenen Optionen abgeschnitten werden.
TRUNCATE TABLE TEST2 DROP ALL STORAGE;
Diese Anweisung Funktioniert tatsächlich, wenn eine Fremdschlüsseleinschränkung auf eine .table angewendet wird
Ich hatte ein ähnliches Problem und habe es anhand der folgenden Skripte gelöst.
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;
/
Dieses Skript deaktiviert zunächst alle Einschränkungen. Schneidet die Daten in den Tabellen ab und aktiviert dann die Einschränkungen.
Ich hoffe es hilft.
prost..
Ein typischer Ansatz zum Löschen vieler Zeilen mit vielen Einschränkungen lautet wie folgt:
mytable_new
mit allen Spalten, jedoch ohne Einschränkungen (oder erstellen Sie Einschränkungen).mytable
in mytable_new
.mytable_new
, um zu sehen, dass alles in Ordnung ist.mytable
verweisen, auf mytable_new
und vergewissern Sie sich, dass alles in Ordnung ist.drop table mytable
.alter table mytable_new rename to mytable
.Es ist viel schneller als das Löschen einer Million Datensätze mit vielen langsamen Einschränkungen.