2016-05-04 13 views
0

Ich möchte explizite Daten in zwei verschiedene Tabellen einfügen, die durch einen Fremdschlüssel mit demselben sequenzgenerierten Wert in beiden Tabellen verknüpft sind.Multitabelleneinfügung mit sequenzgenerierter ID schlägt aufgrund Fremdschlüsselverletzung fehl

Ich versuche eine INSERT ALL-Anweisung zusammen mit einer WITH-Klausel aus aufeinander folgenden UNION ALL-Anweisungen zu verwenden, um dies zu erreichen.

Solange die With-Klausel nicht mehr als 256 Zeilen zurückgibt, funktioniert alles einwandfrei. Sobald ich eine andere UNION ALL-Eintrag hinzufügen, ich die folgende Fehlermeldung erhalten:

ORA-02291: Integritätsbedingung verletzt (MY_SCHEMA.FK_TABLE_B_TO_TABLE_A) - geordneten Schlüssel nicht gefunden * Ursache: Ein Fremdschlüsselwert hat keinen übereinstimmenden Primärschlüsselwert. * Aktion: Löschen Sie den Fremdschlüssel oder fügen Sie einen passenden Primärschlüssel hinzu.

Wenn ich die Fremdschlüsseleinschränkung deaktivieren, funktioniert wieder alles (sogar mit mehr als 256 Zeilen).

Meine Anweisung sieht wie folgt aus:

insert all 
    into MY_SCHEMA.TABLE_A (ID, COLUMN_1, COLUMN_2) 
    values (MY_SCHEMA.MY_SEQUENCE.nextval, COLUMN_1, COLUMN_2) 
    into MY_SCHEMA.TABLE_B (ID, COLUMN_3) 
    values (MY_SCHEMA.MY_SEQUENCE.nextval, COLUMN_3) 

    with input_data as (
    select 11 COLUMN_1, 12 COLUMN_2, 13 COLUMN_3 
     UNION ALL 
    select 21 COLUMN_1, 22 COLUMN_2, 23 COLUMN_3 
     UNION ALL 
     ... 
     UNION ALL 
    select 31 COLUMN_1, 32 COLUMN_2, 33 COLUMN_3 

) 
    select * from input_data; 

Gibt es eine Begrenzung der Menge an Daten, die eine solche Anweisung verarbeiten kann? Oder vermisse ich etwas anderes?

Ich benutze Oracle 11g und SQLDeveloper.

+0

Sie etwas fehlen. Der Fehler ist ein Datenüberprüfungsfehler, der besagt, dass eine Fremdschlüsselbedingung nicht erfüllt ist. Es hat nichts mit der Größe der Daten zu tun. Ein möglicher Täter ist, dass die zusätzlichen Zeilen, die Sie einfügen möchten, doppelte Werte haben. –

+0

Vielen Dank für Ihre Eingabe, wie erklären Sie dann, dass das Deaktivieren des FK den Fehler verschwinden lässt (mit allen Daten, die korrekt eingefügt werden, hätte ich erwähnen sollen)? –

+0

Also, wenn Sie die FK deaktivieren und die gleiche Union alle verwenden, werden alle (mehr als 256) Zeilen eingefügt und Tabellen haben die gleichen IDs? – artm

Antwort

3

Bei der Verwendung von Mehrfachtabellen ist es besser, alle Einschränkungen zu deaktivieren oder sogar zu löschen. Es hat einige wichtige Einschränkungen:

  • Sequenzen sollten nicht
  • die Reihenfolge der Einfügung in die Tabelle guarantied nicht

Also auch dann verwendet werden, wenn Sie absolut gültige Daten einfügen, könnte es auf FK Constraints . Wie auch immer, wenn Sie Ihre Daten schnell in großen Mengen einfügen möchten, möchten Sie nicht die Zeit verschwenden, die auf die Überprüfung von FK wartet.

Update: möglich Duplikat: https://dba.stackexchange.com/questions/23384/using-multi-table-insert-for-parent-and-child-table

Die Oracle-Fehler (2891576) ist noch nicht festgelegt. Oracle bietet Abhilfe.

Solution (Doc-ID 265.826,1)

„Die Reihenfolge der Tabellen, in die Oracle-Dateneinsätze ist nicht bestimmt (garantiert) Deshalb, bevor eine Multitable Insert-Anweisung Ausgabe, Sie sollte alle Einschränkungen aufschieben und alle Trigger deaktivieren, die von einer bestimmten Tabellenreihenfolge für die multititable Einfügeoperation abhängen. "

Abhilfe:

  1. Deaktivieren Sie den Fremdschlüssel, wenn eine solche MultiPath Einsätze laufen.
  2. Verwenden Sie DEFERRED CONSTRAINTS, damit die Überprüfung nur zur Commit-Zeit erfolgt.

Über Latente Constraints prüfen Metalink Hinweis: 73.647,1 "Latente Constraints Beispiel"

+0

Was meinen Sie mit _sequenzen kann nicht verwendet werden_? Ich weiß, dass sie nicht in einer Unterabfrage verwendet werden können (siehe [Oracle offizielle Dokumentation] (https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#i2095116)), aber in meinem Beispiel I benutze Sequenzen und es ist ein Multitable einfügen ... –

+0

Ich konnte auch nirgends in der [Offizielle Dokumentation] finden (https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9014.htm#i2095116) etwas über die Ausführungsreihenfolge der INTO-Klauseln ist undefiniert –

+0

Ich denke, diese Einschränkung habe ich irgendwo in Datawarehousing Guide gelesen. Hier sind einige andere Einschränkungen erwähnt: http://allthingsoracle.com/multi-table-insert-statements-in-oracle/ – ibre5041