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

PostgreSQL - indstil en standardcelleværdi i henhold til en anden celleværdi

Dette er ikke muligt med en simpel DEFAULT værdi, som manualen tydeligt siger:

Værdien er ethvert variabelfrit udtryk (underforespørgsler og krydsreferencer til andre kolonner i den aktuelle tabel er ikke tilladt).

Du kan bruge en trigger i stedet:

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

Brug en WHEN for at gøre det mere effektivt klausul i triggerdefinitionen (tilgængelig siden Postgres 9.0):På denne måde udføres triggerfunktionen kun, når den faktisk er nyttig. (Forudsat at vi kan lade b IS NULL slide hvis a IS NULL .)

Fungerer i en lignende, men subtilt anderledes mode fra en DEFAULT værdi.
Med en standardværdi kan du udtrykkeligt indsætte NULL for at tilsidesætte standarden. Det er ikke muligt her, NULL i b erstattes med værdien afledt af a .



  1. SQLite - Enhver forskel mellem tabel-begrænsning UNIQUE og kolonne-begrænsning UNIQUE?

  2. Sådan gemmer du en database som en skabelon i Access 2016

  3. Introduktion til Inline Table-Valued Functions (ITVF) i SQL Server

  4. PL/SQL-program til at slette posterne fra tabellen