PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL - legt einen Standardzellenwert entsprechend einem anderen Zellenwert fest

Dies ist nicht möglich mit einem einfachen DEFAULT Wert, wie das Handbuch klar sagt:

Der Wert ist ein beliebiger variablenfreier Ausdruck (Unterabfragen und Querverweise auf andere Spalten in der aktuellen Tabelle sind nicht erlaubt).

Sie könnten einen Trigger verwenden stattdessen:

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

Um es effizienter zu machen, verwenden Sie ein WHEN -Klausel in der Trigger-Definition (verfügbar seit Postgres 9.0):Auf diese Weise wird die Trigger-Funktion nur ausgeführt, wenn sie tatsächlich nützlich ist. (Angenommen, wir können b IS NULL lassen gleiten, wenn a IS NULL .)

Funktioniert ähnlich, aber subtil anders Mode aus einem DEFAULT Wert.
Bei einem Standardwert können Sie explizit NULL einfügen die Vorgabe zu überschreiben. Das ist hier nicht möglich, NULL in b wird durch den von a abgeleiteten Wert ersetzt .