Fügen Sie den Standardwert ein, wenn Null eingefügt wird

8

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.

    
SWilk 22.03.2011, 08:55
quelle

5 Antworten

11

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.

    
Lisa Aaron 06.05.2016, 10:42
quelle
2

Wie in diesem AskTom-Thread , das Schlüsselwort DEFAULT funktioniert nur als eigenständiger Ausdruck in einer Spalteneinfügung und funktioniert nicht, wenn es mit Funktionen oder Ausdrücken wie NVL gemischt wird.

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 .

    
Vincent Malgrat 22.03.2011 09:15
quelle
1

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%     
Martin Schapendonk 22.03.2011 09:17
quelle
1

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:

%Vor%     
FerranB 22.03.2011 21:55
quelle
0
  

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.

    
tbone 22.03.2011 10:50
quelle

Tags und Links