Ich habe eine Oracle-Datenbank und eine Tabelle mit mehreren Nicht-Null-Spalten, alle mit Standardwerten.
Ich möchte eine Insert-Anweisung für alle Daten verwenden, die ich einfügen möchte, und nicht die Mühe zu prüfen, ob die eingegebenen Werte Nullen sind oder nicht.
Gibt es eine Möglichkeit, auf den Standardspaltenwert zurückzugreifen, wenn Null eingefügt wird?
Ich habe diesen Code:
%Vor%Also muss ich die Spalte komplett weglassen, sonst bekomme ich den Fehler "versuche, null in eine nicht-null-Spalte einzufügen". Natürlich habe ich mehrere Nullable-Spalten, daher ist die Code-Insert-Anweisung sehr unlesbar, hässlich, und ich mag sie einfach nicht.
Ich hätte gerne eine Aussage, ähnlich wie:
%Vor%Das ist natürlich eine hypothetische Abfrage. Wissen Sie, wie ich dieses Ziel mit Oracle DBMS erreichen würde?
BEARBEITEN :
Vielen Dank für Ihre Antworten. Es scheint, dass es keinen "normalen" Weg gibt, um das zu erreichen, was ich wollte, also akzeptierte ich die beste Antwort der IMO: Ich sollte aufhören, clever zu sein und einfach die Nullwerte durch automatisch erstellte Anweisungen wegzulassen.
Nicht genau das, was ich gerne sehen würde, aber keine bessere Wahl.
Für diejenigen, die es jetzt lesen:
In Oracle 12c gibt es ein neues Feature: DEFAULT ON NULL . Zum Beispiel:
%Vor%Wenn Sie also versuchen, null in Spalte 2 einzufügen, wird dies automatisch 7 sein.
Wie in diesem AskTom-Thread DEFAULT
Mit anderen Worten, dies ist eine gültige Abfrage:
%Vor% Sie können eine dynamische Abfrage mit allen Zeilen und entweder eine Bindevariable oder die Konstante DEFAULT verwenden, wenn die Variable null ist. Dies könnte so einfach sein wie das Ersetzen der Zeichenfolge :not_null_column_with_default_value
durch die Zeichenfolge DEFAULT
in $insert
.
Sie können auch die Ansicht ALL_TAB_COLUMNS
abfragen und nvl(:your_variable, :column_default)
verwenden. Der Standardwert ist die Spalte DATA_DEFAULT
.
Ich denke, der sauberste Weg ist, sie in Ihrer INSERT-Anweisung nicht zu erwähnen. Du könntest anfangen, Trigger zu schreiben, um Standardwerte zu füllen, aber das ist eine schwere Rüstung für das, was du anstrebst.
Ist es nicht möglich, Ihren Anwendungscode ein wenig zu restrukturieren? In PHP könnten Sie eine saubere INSERT-Anweisung ohne unordentliche Wenns, z.B. so:
%Vor%Die bessere Option für die Leistung ist die erste.
Wie Sie wissen, möchten Sie die Namen und Werte der Einfügespalte wegen der schwierigen Änderungen nicht wiederholen. Eine andere Option, die Sie verwenden können, besteht darin, eine Einfügung mit auszuführen Klausel gefolgt von einem Update:
%Vor%Es scheint mit PHP zu funktionieren .
Danach können Sie nach null
auf insered_value
bind Variable suchen. Wenn es null ist, können Sie das folgende Update ausführen:
Ich würde gerne einen Einsatz verwenden Aussage für irgendwelche Daten, die ich will einfügen, und überprüfen Sie nicht, ob Die eingegebenen Werte sind Nullen oder nicht.
Definieren Sie Ihre Tabelle mit einem Standardwert für diese Spalte. Zum Beispiel:
%Vor%oder ändern Sie eine vorhandene Tabelle:
%Vor%Jetzt müssen Sie (oder jeder, der myTable verwendet) sich nicht um Standardwerte kümmern, wie es sein sollte. Beachten Sie, dass für dieses Beispiel die Spalte weiterhin nullfähig ist, sodass jemand explizit eine Null einfügen kann. Wenn dies nicht erwünscht ist, machen Sie die Spalte nicht null.
EDIT: Angenommen, das oben Genannte ist bereits erledigt, können Sie das DEFAULT-Schlüsselwort in Ihrer insert-Anweisung verwenden. Ich würde Auslöser dafür vermeiden.