PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL - đặt giá trị ô mặc định theo giá trị ô khác

Điều này không thể với DEFAULT đơn giản giá trị, như hướng dẫn sử dụng ghi rõ:

Giá trị là bất kỳ biểu thức không có biến nào (không cho phép truy vấn con và tham chiếu chéo đến các cột khác trong bảng hiện tại).

Bạn có thể sử dụng trình kích hoạt thay vào đó:

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

Để làm cho nó hiệu quả hơn, hãy sử dụng WHEN mệnh đề trong định nghĩa trình kích hoạt (có sẵn kể từ Postgres 9.0):Theo cách này, hàm kích hoạt chỉ được thực thi khi nó thực sự hữu ích. (Giả sử chúng ta có thể cho phép b IS NULL trượt nếu a IS NULL .)

Hoạt động tương tự, nhưng khác biệt một cách tinh tế thời trang từ một DEFAULT giá trị.
Với giá trị mặc định, bạn có thể chèn rõ ràng NULL để vượt qua mặc định. Điều đó không thể thực hiện được ở đây, NULL trong b được thay thế bằng giá trị bắt nguồn từ 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. PostgreSQL 12:Khóa ngoại và bảng phân vùng

  2. Phân tích thống kê bảng PostgreSQL

  3. Gây ra bởi:java.lang.NoSuchMethodError:org.postgresql.core.BaseConnection.getEncoding () Lorg / postgresql / core / Encoding;

  4. đặc điểm `diesel ::Expression` không được triển khai cho` bigdecimal ::BigDecimal`

  5. Cách Log () hoạt động trong PostgreSQL