PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PostgreSQL - tetapkan nilai sel default sesuai dengan nilai sel lain

Ini tidak mungkin dengan DEFAULT sederhana nilai, seperti yang dinyatakan dengan jelas oleh manual:

Nilainya adalah ekspresi bebas variabel apa pun (subkueri dan referensi silang ke kolom lain dalam tabel saat ini tidak diizinkan).

Anda dapat menggunakan pemicu sebagai gantinya:

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

Untuk membuatnya lebih efisien gunakan WHEN klausa dalam definisi pemicu (tersedia sejak Postgres 9.0):Dengan cara ini fungsi pemicu hanya dijalankan, ketika itu benar-benar berguna. (Dengan asumsi kita dapat membiarkan b IS NULL geser jika a IS NULL .)

Bekerja dengan cara yang serupa, tetapi sedikit berbeda fashion dari DEFAULT value.
Dengan nilai default, Anda dapat secara eksplisit memasukkan NULL untuk mengesampingkan default. Itu tidak mungkin di sini, NULL di b diganti dengan nilai yang diturunkan dari 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. Manajemen &Pemantauan Basis Data untuk PostgreSQL 12

  2. Deteksi item duplikat dalam CTE rekursif

  3. Oracle ke PostgreSQL — Kursor dan Ekspresi Tabel Umum

  4. Strategi efektif untuk meninggalkan jejak audit/riwayat perubahan untuk aplikasi DB?

  5. Bagaimana Log() Bekerja di PostgreSQL