wake-up-neo.net

Tabelle in Oracle abschneiden und Fehler erhalten

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?

21
PPShein

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.

33
RichardTheKiwi

diese Seite bietet eine sehr gute Lösung ...

ORA-02266: Eindeutige/Primärschlüssel in der Tabelle, auf die durch aktivierte Fremdschlüssel verwiesen wird

Ich kopiere hier die Lösung:

  • Suchen Sie die referenzierten ENABLED-Fremdschlüsseleinschränkungen und deaktivieren Sie sie.
  • aus der Tabelle kürzen/löschen.
  • 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');
    
8
Najee Ghanim

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;

8
David Gelhar

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;
2
Srikant Patra

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.

1
Lorenzo
TRUNCATE TABLE TEST2 DROP ALL STORAGE;

Diese Anweisung Funktioniert tatsächlich, wenn eine Fremdschlüsseleinschränkung auf eine .table angewendet wird

0
plsql developer

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.. 

0
Akhil

Ein typischer Ansatz zum Löschen vieler Zeilen mit vielen Einschränkungen lautet wie folgt:

  • erstellen Sie mytable_new mit allen Spalten, jedoch ohne Einschränkungen (oder erstellen Sie Einschränkungen).
  • kopieren Sie alle benötigten Daten von mytable in mytable_new.
  • aktivieren Sie Einschränkungen für mytable_new, um zu sehen, dass alles in Ordnung ist.
  • Ändern Sie stattdessen alle Einschränkungen, die auf 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.

0
9000