Cập nhật dấu thời gian khi hàng được cập nhật trong PostgreSQL


85

Trong MySQL, chúng ta có thể thực thi điều này khi nó cập nhật cột changetimestampmỗi khi hàng được thay đổi:

create table ab (
  id int, 
  changetimestamp timestamp 
    NOT NULL 
    default CURRENT_TIMESTAMP 
    on update CURRENT_TIMESTAMP 
);

Có điều gì đó tương tự để làm những điều trên trong PostgreSQL không?


afaik không phải là dễ dàng trong PostgreSQL nơi bạn cần kích hoạt: pointbeing.net/weblog/2008/03/...
mechanical_meat

2
Cần lưu ý rằng MySQL có một số "phương pháp điều trị đặc biệt" cho timestampcác cột tùy thuộc vào phiên bản và cài đặt, mà (may mắn thay!) Không thể được sao chép trong Postgres. Như cho phép 0một timestampcột hoặc chuyển đổi NULLthành dấu thời gian hiện tại trên đầu vào trong các chòm sao nhất định. Hãy chắc chắn nghiên cứu hướng dẫn sử dụng của cả RDBMS để nhận thức được sự khác biệt nhỏ: MySQLPostgres .
Erwin Brandstetter

1
@ErwinBrandstetter có phải câu trả lời được cung cấp bên dưới vẫn là phương pháp hay nhất để tự động cập nhật dấu thời gian vào năm 2018?
CommonSenseCode

Câu trả lời:


124

Tạo một hàm cập nhật cột nhãn thay đổi của một bảng như sau:

CREATE OR REPLACE FUNCTION update_changetimestamp_column()
RETURNS TRIGGER AS $$
BEGIN
   NEW.changetimestamp = now(); 
   RETURN NEW;
END;
$$ language 'plpgsql';

Tạo một trình kích hoạt trên bảng gọi hàm update_changetimestamp_column () bất cứ khi nào một bản cập nhật xảy ra như vậy:

    CREATE TRIGGER update_ab_changetimestamp BEFORE UPDATE
    ON ab FOR EACH ROW EXECUTE PROCEDURE 
    update_changetimestamp_column();

2
Vì vậy, không có cách nào khác để làm những gì tôi muốn ngoại trừ thông qua một trình kích hoạt? Bởi vì tôi muốn triển khai 'dấu thời gian cập nhật' cho tất cả các bảng của tôi có thể là 300+. Và tôi nghĩ rằng việc tạo trình kích hoạt có thể gây ra một số vấn đề về hiệu suất.
bichonfrise74

5
Theo như tôi biết thì đây là cách tiêu chuẩn để thực hiện việc này trong postgresql. Khi bạn viết "on update current_timestamp" trong mysql, nó sẽ tạo ra một trình kích hoạt trên bảng trong nền. Sự khác biệt là bạn đang viết trình kích hoạt ở đây theo cách thủ công thay vì viết nó cho bạn.
Charles Ma

3
Thực tế không có hình phạt hiệu suất - ít nhất là trong bất kỳ cơ sở dữ liệu hợp lý nào.

5
Có cách nào để cung cấp tên cột cần được cập nhật làm tham số cho hàm update_changetimestamp_columnkhông?
Antoan Milkov

7
@womble Có thể sẽ rất hữu ích nếu bạn đăng một ví dụ về điều này. Nếu tôi quản lý cách chỉ định động cột nào cần cập nhật, tôi sẽ viết nó dưới dạng câu trả lời.
MirroredFate
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.