sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL - nastavte výchozí hodnotu buňky podle hodnoty jiné buňky

To není možné s jednoduchým DEFAULT hodnota, jak je v návodu jasně uvedeno:

Hodnota je jakýkoli výraz bez proměnných (poddotazy a křížové odkazy na jiné sloupce v aktuální tabulce nejsou povoleny).

Můžete použít spouštěč místo toho:

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

Chcete-li to zefektivnit, použijte WHEN klauzule v definici spouštění (dostupná od Postgresu 9.0):Tímto způsobem se spouštěcí funkce provádí pouze tehdy, když je skutečně užitečná. (Za předpokladu, že můžeme nechat b IS NULL slide if a IS NULL .)

Funguje podobně, ale jemně se liší móda z DEFAULT value.
S výchozí hodnotou můžete explicitně vložit NULL přepsat výchozí. To zde není možné, NULL v b je nahrazeno hodnotou odvozenou z a .



  1. Nejlepší způsob, jak resetovat sekvenci Oracle na další hodnotu v existujícím sloupci?

  2. Jak upravit datový typ v Oracle s existujícími řádky v tabulce

  3. Jak přidat sloupec v SQL

  4. Nelze získat jarní spouštění pro automatické vytvoření schématu databáze