PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL - ustaw domyślną wartość komórki zgodnie z inną wartością komórki

To nie jest możliwe z prostym DEFAULT wartość, ponieważ instrukcja wyraźnie stwierdza:

Wartość jest dowolnym wyrażeniem wolnym od zmiennych (podzapytania i odsyłacze do innych kolumn w bieżącej tabeli są niedozwolone).

Możesz użyć wyzwalacza zamiast tego:

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

Aby uczynić go bardziej wydajnym, użyj WHEN klauzula w definicji wyzwalacza (dostępna od Postgres 9.0):W ten sposób funkcja wyzwalacza jest wykonywana tylko wtedy, gdy jest rzeczywiście przydatna. (Zakładając, że możemy pozwolić b IS NULL przesuń, jeśli a IS NULL .)

Działa w podobnym, ale nieco innym moda z DEFAULT wartość.
Przy wartości domyślnej możesz jawnie wstawić NULL aby zastąpić wartość domyślną. Tutaj nie jest to możliwe, NULL w b jest zastępowane wartością pochodzącą z a .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakie są zalety i wady wykonywania obliczeń w sql vs. w Twojej aplikacji?

  2. Pięć fajnych rzeczy, których nauczyłem się na konferencji PostgreSQL w Europie 2018

  3. Przekazywanie wielu wartości w jednym parametrze

  4. Wyrażenie regularne w klauzuli PostgreSQL LIKE

  5. przechowuj ciągi o dowolnej długości w Postgresql