Ist es sicher, die Einfügeanweisung für mehrere Tabellen von Oracle zum Einfügen in eine übergeordnete und untergeordnete Tabelle (mit Fremdschlüsselbeschränkung) zu verwenden?
Mit minimalen Beispielen habe ich festgestellt, dass es funktioniert, solange die übergeordnete Tabelle vor der untergeordneten Tabelle in der into
Liste steht. Kann ich mich darauf verlassen oder sollte ich die Einschränkung aufschieben?
oracle
foreign-key
Isaac Kleinman
quelle
quelle
INSERT ALL
?insert all
- das kann Isaacs Grund sein?INSERT ALL
viele Einschränkungen: keine parallele Ausführung, kein Einfügen in eine Ansicht. Dies lässt mich denken, dass diese Anweisung weniger optimiert ist als StandardanweisungenINSERT
, insbesondere beim Einfügen in mehrere Tabellen.Antworten:
Nein , darauf können Sie sich nicht verlassen. SQL ist deklarativ und nicht prozedural. Daher können Sie innerhalb einer Anweisung die Ausführungsreihenfolge nicht garantieren. Da die gesamte
INSERT ALL
Anweisung als einzelne Anweisung ( doc ) betrachtet wird, können Sie nicht garantieren, dass eineINSERT
vor der anderen steht.Per Definition
INSERT FIRST
muss ein erstes AusführenINTO
der bewerteten Bedingungen ausgeführt werden. Wir könnten erwartenINSERT ALL
, dass wir uns ähnlich verhalten. Dies scheint der Fall zu sein:Obwohl wir ein bestimmtes Verhalten auf einer bestimmten Plattform / Version / Patchset demonstrieren können, ist dies dennoch keine Garantie.
Oracle-developer.net sagt es ausdrücklich:
quelle
DEFERRED CONSTRAINTS
.Isaac,
Sie können sich nicht darauf verlassen, da Orakel die Bestellung von INSERT nicht garantiert. Der richtige Weg, dies zu tun, ist, wie Sie erwähnt haben, die verzögerte Fremdschlüsseleinschränkung.
quelle
INSERT ... SELECT
hier an: sqlfiddle.com/#!15/7de0f (beachten Sie, dass es mit PostreSQL und Oracle funktioniert, aber nicht mit MySQL oder MS SQL)