Postgresql déclencheur d'insertion à la valeur définie
Assumer dans Postgresql, j'ai une table T
et l'un de ses colonnes est C1
.
Je veux déclencher une fonction lorsqu'un nouvel enregistrement est d'ajouter à la table T
. La fonction doit vérifier la valeur de la colonne C1
dans le nouveau dossier et si elle est null/vide, puis définissez sa valeur à 'X'
.
Est-ce possible?
- Veuillez noter que cette valeur de X doit être récupéré à partir d'une autre sous-requête.
Vous devez vous connecter pour publier un commentaire.
Il est exact que vous avez besoin d'un déclencheur, parce que la définition d'une valeur par défaut pour la colonne de ne pas travailler pour vous - valeurs par défaut ne fonctionne que pour
null
valeurs et de ne pas vous aider dans la prévention des valeurs vides.Dans postgres, il y a quelques étapes à suivre pour créer un déclencheur:
Étape 1: Créer une fonction qui renvoie le type de
trigger
:Étape 2: Créer un trigger qui déclenche avant d'insertion, qui permet de modifier les valeurs befre ils sont insérés, qui appelle la fonction ci-dessus:
Et vous avez terminé.
Voir le code ci-dessus exécution sur SQLFIddle démontrant qu'il fonctionne correctement!
Vous indiquez dans un commentaire que la valeur
'X'
est récupéré à partir d'une sous-requête. Si oui, le changement de la ligne pertinente donc quelque chose comme:$$
mais au lieu'
?$$
. J'ai été privé de l'aide de toutes les fonctions de ce moment jusqu'à ce que vous l'avez souligné que les!IF
, vous pouvez utiliser une seule ligne avec fusionnent() , quelque chose comme :new.c1 := coalesce (new.c1,X);
C'est possible, mais vous êtes probablement mieux de réglage de défaut de la contrainte sur la colonne de la place. Lors de la création de la table qui ressemblerait à:
Ce dit que si vous ajoutez une ligne à la table et de ne pas spécifier la valeur de C1, alors X sera utilisé à la place. La non null n'est pas nécessaire, mais empêche les mises à jour de micropression cette colonne en supposant qu'est ce que vous voulez.
EDIT: Cela ne fonctionne que pour la constante de X, de vos commentaires, il semble qu'il y a deux solutions possibles.
L'aide d'un déclencheur ressemblerait à quelque chose comme ceci:
La
new
variable dans une fonction de déclenchement est spécial, représentant la ligne à insérer. La spécification de la gâchette comme unbefore insert
déclencher signifie que vous pouvez modifier la ligne avant il est écrit au tableau.La deuxième solution serait d'utiliser une colonne calculée qui Postgres définit d'une manière inhabituelle:
Cela crée une fonction qui prend une ligne de votre tableau et renvoie une valeur, vous pouvez l'appeler à l'aide . notation si, ce qui signifie que vous pouvez faire:
La déclaration de la fonction qui est immuable est facultatif, mais il est nécessaire si vous voulez de l'indice de la "colonne". Vous seriez en mesure de l'indice de cette colonne comme ceci: