Insérer la valeur par défaut lorsque la valeur null est inséré
J'ai une base de données Oracle, et une table avec plusieurs colonnes not null, tous avec des valeurs par défaut.
Je voudrais utiliser un insert pour toutes les données que je veux insérer, et n'a pas pris la peine de vérifier si les valeurs insérées sont des valeurs null ou pas.
Est-il possible de tomber par défaut de la valeur de la colonne lorsque la valeur null est inséré?
J'ai ce code:
<?php
if (!empty($values['not_null_column_with_default_value'])) {
$insert = "
INSERT INTO schema.my_table
( pk_column, other_column, not_null_column_with_default_value)
VALUES
(:pk_column,:other_column,:not_null_column_with_default_value)
";
} else {
$insert = "
INSERT INTO schema.my_table
( pk_column, other_column)
VALUES
(:pk_column,:other_column)
";
}
Donc, je dois omettre la colonne entièrement, ou je vais avoir l'erreur "d'essayer d'insérer la valeur null à la colonne not null".
Bien sûr, j'ai plusieurs nullable colonnes, de sorte que le code créer instruction insert est très illisible, laid, et je ne l'aime pas de cette façon.
Je voudrais avoir une déclaration, quelque chose de similaire à:
INSERT INTO schema.my_table
( pk_column, other_column, not_null_column_with_default_value)
VALUES
(:pk_column,:other_column, NVL(:not_null_column_with_default_value, DEFAULT) );
Qui est bien sûr un hypothétique de la requête. Savez-vous que je permettrait d'atteindre cet objectif avec le SGBD Oracle?
MODIFIER:
Merci à vous tous pour vos réponses. Il semble qu'il n'y a pas de façon "standard" pour obtenir ce que je voulais, j'ai donc accepté l'OMI meilleure réponse: Que je devrais arrêter d'être intelligents et de se contenter de omettant les valeurs null via automatiquement construit consolidés.
Pas exactement ce que je voudrais voir, mais pas de meilleur choix.
Parce que je ne sais pas quelle est la valeur par défaut au moment de l'insertion. Mais comme @Vincent Malgrat a suggéré que je peux récupérer cette forme ALL_TAB_COLUMNS
OriginalL'auteur SWilk | 2011-03-22
Vous devez vous connecter pour publier un commentaire.
Pour ceux qui le lire maintenant:
Dans Oracle 12c est nouvelle fonctionnalité: PAR DÉFAUT À NULL. Par exemple:
Ainsi, lorsque vous essayez d'INSÉRER la valeur null dans col2, ce sera automatiquement 7.
OriginalL'auteur Lisa Aaron
Comme expliqué dans ce AskTom fil, le
DEFAULT
mot-clé ne fonctionnera que comme un stand-alone expression dans une colonne d'insertion et ne fonctionne pas lorsqu'il est mélangé avec des fonctions ou des expressions telles que NVL.En d'autres mots il s'agit d'une requête valide:
Vous pouvez utiliser une requête dynamique avec toutes les lignes et soit une liaison de variable ou de la constante par DÉFAUT si la variable est null. Cela pourrait être aussi simple que de remplacer la chaîne
:not_null_column_with_default_value
avec la chaîneDEFAULT
dans votre$insert
.Vous pouvez également interroger la vue
ALL_TAB_COLUMNS
et l'utilisationnvl(:your_variable, :column_default)
. La valeur par défaut est la colonneDATA_DEFAULT
.get_default(:schema,:table,:column)
qui utilisent oracle cache, donc je ne dois pas être très lent. Je vais vérifier si l' <Long> type peuvent être convertis à d'autres types sans problèmes.Le <long> le type est l'ancien CLOB. C'est juste le texte et doit être convertie en une chaîne de caractères. Dans votre requête, vous devez remplacer par DÉFAUT par la valeur de cette colonne, et pas bind la valeur, car la valeur par défaut peut être une expression (comme
trunc(sysdate)+1
)Bon point, merci.
L'interrogation du dictionnaire de données de la valeur par défaut sur chaque et chaque insertion va certainement ruiner votre performance. J'aimerais l'utiliser seulement si la performance de l'insert n'est pas un problème pour votre application.
OriginalL'auteur Vincent Malgrat
Je pense que la façon la plus propre est de ne pas les mentionner dans votre INSÉREZ l'instruction. Vous pourriez commencer à écrire des déclencheurs pour remplir les valeurs par défaut, mais c'est une armure lourde pour ce que vous êtes visant à.
N'est-il pas possible de restructurer le code de votre application, un peu? En PHP, vous pouvez créer un propre INSÉREZ-déclaration sans désordre si, par exemple comme ceci:
vous avez raison. Mon exemple peut facilement être modifié pour utiliser des variables de liaison. En fait, je viens de le faire.
OriginalL'auteur Martin Schapendonk
La meilleure option pour les performances est la première.
De toute façon, ce que je comprends, vous ne voulez pas de répéter l'insérer les noms de colonnes et les valeurs, en raison de la difficile de faire des modifications. Une autre option que vous pouvez utiliser est d'exécuter un insert avec de retour clause suivie par une mise à jour:
Il semble travailler avec PHP.
Après cela, vous pouvez vérifier pour
null
surinsered_value
lier des variables. Si c'est null, vous pouvez exécuter la mise à jour suivante:OriginalL'auteur FerranB
Définir votre table avec une valeur par défaut pour la colonne. Par exemple:
ou de modifier une table existante:
Maintenant, vous (ou quelqu'un à l'aide de myTable) n'avez pas à vous soucier des valeurs par défaut, comme il devrait l'être. Sachez juste que, pour cet exemple, la colonne est toujours nullable, si quelqu'un pouvait insérer explicitement une valeur null. Si ce n'est pas désiré, faites la colonne not null.
EDIT: en Supposant que le ci-dessus est déjà fait, vous pouvez utiliser le mot clé DEFAULT dans votre instruction insert. Je voudrais éviter les déclencheurs de cette.
insert into tmp_table_tab (aaa,bbb,ccc) values(9, 8, nvl(:my_value,DEFAULT))
résultats en ORA-00936 manque d'expression. Alors queinsert into tmp_table_tab (aaa,bbb,ccc) values(9, 8, DEFAULT)
exécuter correctement, il ne fait autre chose que j'ai besoin. Je voudrais oublier la valeur de :my_Value et l'utilisation d'une instruction INSERT pour toutes les insertions.ok, je comprends maintenant. Malheureusement, vous n'allez probablement pas à trouver un éloquent solution pour avoir un maître d'insertion pour toutes les colonnes null ou pas. Si vous ne pouvez pas changer votre insert stmt basée sur les cols sont nuls, puis une avant de déclencheur d'insertion serait la meilleure chose suivante. Gardez à l'esprit que si une colonne est modifiée de not null pour les valeurs null, vous DEVEZ également modifier le déclencheur à exclure à l'aide de valeurs par défaut pour la colonne. (ajoute des frais de maintenance ainsi que de la charge de traitement).
OriginalL'auteur tbone