PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:imposta un valore di cella predefinito in base a un altro valore di cella

Questo non è possibile con un semplice DEFAULT valore, come afferma chiaramente il manuale:

Il valore è qualsiasi espressione priva di variabili (non sono consentiti sottoquery e riferimenti incrociati ad altre colonne nella tabella corrente).

Potresti usare un trigger invece:

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();

Per renderlo più efficiente usa un WHEN clausola nella definizione del trigger (disponibile da Postgres 9.0):in questo modo la funzione trigger viene eseguita solo quando è effettivamente utile. (Supponendo che possiamo lasciare che b IS NULL diapositiva se a IS NULL .)

Funziona in modo simile, ma sottilmente diverso moda da un DEFAULT value.
Con un valore predefinito, puoi inserire esplicitamente NULL per annullare l'impostazione predefinita. Non è possibile qui, NULL in b viene sostituito con il valore derivato da a .