Đ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
.