sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL - ställ in ett standardcellvärde enligt ett annat cellvärde

Detta är inte möjligt med en enkel DEFAULT värde, som manualen tydligt säger:

Värdet är valfritt variabelfritt uttryck (underfrågor och korsreferenser till andra kolumner i den aktuella tabellen är inte tillåtna).

Du kan använda en trigger istället:

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

För att göra det mer effektivt använd en WHEN klausul i triggerdefinitionen (tillgänglig sedan Postgres 9.0):På så sätt exekveras triggerfunktionen bara när den faktiskt är användbar. (Förutsatt att vi kan låta b IS NULL skjut om a IS NULL .)

Fungerar i en liknande, men subtilt annorlunda mode från en DEFAULT värde.
Med ett standardvärde kan du uttryckligen infoga NULL för att åsidosätta standardinställningen. Det är inte möjligt här, NULL i b ersätts med värdet som härrör från a .



  1. 3 SQL Server-övervakningsfrågor att ställa när man tar över en DBA-position

  2. ver.2 PyGreSQL FEL:från _pg import * ImportError:DLL-laddning misslyckades:Den angivna modulen kunde inte hittas

  3. Dela upp varchar i separata kolumner i Oracle

  4. Hur man lägger till en datafil till en SQL Server-databas (T-SQL)