Oracle 'ALLES EINFÜGEN' ignorieren Duplikate
Ich habe eine Datenbank-Tabelle mit einer unique-Einschränkung auf Sie (einzigartigen (DADSNBR, DAROLEID)
- pair-Mädchen). Ich werde das einfügen mehrerer Werte in dieser Tabelle gleichzeitig, so würde ich mag, um es getan mit einer Anfrage - ich nehme an, das wäre der schnellere Weg. Meine Abfrage ist so:
INSERT ALL
INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 1)
INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 2)
INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 3)
INTO ACCESS (DADSNBR, DAROLEID) VALUES (68, 4)
SELECT 1 FROM DUAL
Da gibt es einige Einträge in der Anweisung, die Duplikate von denen, die Sie bereits in der Datenbank, das ganze einfügen schlägt fehl, und keine Zeilen eingefügt werden.
Gibt es eine Möglichkeit zu ignorieren, die Fälle, in denen die unique-Einschränkung fehl, und legen Sie einfach diejenigen, die einzigartig sind, die zimmerreserviereung, ohne das es aufgeteilt in einzelne INSERT-Anweisungen?
Edit: merkte ich, dass ich wahrscheinlich nicht wollen, tun das sowieso, aber ich bin immer noch neugierig, ob es möglich ist oder nicht.
- Keiner deiner Zeilen die Duplikate (?!)
- Ich meine, Sie sind Duplikate der Werte, die bereits in der Datenbank vor dem ausführen der insert-Anweisung. Bearbeitet meine Frage für Klarheit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Oracle-Anweisungen, die entweder vollständig gelingen oder scheitern vollständig (Sie sind atomic). Sie können jedoch hinzufügen Klauseln in bestimmten Fällen zu melden Ausnahmen anstatt Fehler:
BULK COLLECT - SAVE EXCEPTIONS
wurde gezeigt, wie in dieser thread auf askTom,DBMS_ERRLOG
(ab 10g glaub ich).Die zweite Methode ist die automatische, hier ist eine demo (mit 11gR2):
Können Sie die
LOG ERROR
Klausel mitINSERT ALL
(Dank @Alex Poole), aber Sie haben, um Sie auf die Klausel nach jeder Tabelle:INSERT ALL
, aber Sie müssen, um eineLOG ERRORS
Klausel nach jederINTO ...
- wie gezeigt-ein bisschen schräg in docs. Also in diesem FallINSERT ALL INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED INTO test VALUES (1, 1) LOG ERRORS REJECT LIMIT UNLIMITED SELECT * FROM dual
. Was vielleicht sogar Sinn macht, da dieINTO
s könnte sein, für verschiedene Tabellen.Die MERGE-Anweisung verwenden, um mit dieser situation umzugehen:
ORA-00928: missing SELECT keyword: merge into DADSNBR using ( select :q0 as DADSNBR, :q1 as DAROLEID from dual union all ) t on (t.DADSNBR = access.DADSNBR and t.DAROLEID = access.DAROLEID) when not matched then insert (DADSNBR, DAROLEID) values (t.DADSNBR, t.DAROLEID)
Ich habe die zweite DADSNBR in Ihrer Abfrage zu DAROLEID seit das ist, was ich annehmen, dass Sie damit meinte, aber das trifft es nicht lösen. 🙁union all
verbindet mehrereselect
Aussagen - vier in diesem Beispiel, wie in deiner ursprünglichen Frage - in einer einzigen Ergebnismenge. Ihre version hat ein trailingunion all
; das sollte nicht erscheinen, nachdem die Letzteselect
sub-Anweisung.WHEN MATCHED
- Klausel, wird nichts passieren. So sind nur die nicht-vorhandene Zeilen in die Zieltabelle eingefügt. Siehe mein Beispiel hier: sqlfiddle.com/#!4/79c66/3