PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL - définir une valeur de cellule par défaut en fonction d'une autre valeur de cellule

Ce n'est pas possible avec un simple DEFAULT valeur, comme l'indique clairement le manuel :

La valeur est une expression sans variable (les sous-requêtes et les références croisées à d'autres colonnes de la table actuelle ne sont pas autorisées).

Vous pouvez utiliser un déclencheur à la place :

CREATE OR REPLACE FUNCTION trg_foo_b_default()
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
   -- For just a few constant options, CASE does the job:
   NEW.b := CASE NEW.a
               WHEN 'peter'  THEN 'doctor'
               WHEN 'weirdo' THEN 'shrink'
               WHEN 'django' THEN 'undertaker'
               ELSE NULL
            END;

   /*
   -- For more, or dynamic options, consider a lookup table:
   SELECT INTO NEW.b  t.b
   FROM   def_tbl t
   WHERE  t.a = NEW.a;
   */

   RETURN NEW;
END
$func$;


CREATE TRIGGER b_default
BEFORE INSERT ON foo
FOR EACH ROW
WHEN (NEW.b IS NULL AND NEW.a IS NOT NULL)
EXECUTE PROCEDURE trg_foo_b_default();

Pour le rendre plus efficace, utilisez un WHEN clause dans la définition du déclencheur (disponible depuis Postgres 9.0) :de cette façon, la fonction de déclenchement n'est exécutée que lorsqu'elle est réellement utile. (En supposant que nous puissions laisser b IS NULL glisser si a IS NULL .)

Fonctionne de manière similaire, mais subtilement différente mode à partir d'un DEFAULT value.
Avec une valeur par défaut, vous pouvez insérer explicitement NULL pour annuler la valeur par défaut. Ce n'est pas possible ici, NULL en b est remplacé par la valeur dérivée de a .