Câu hỏi Làm cách nào để tự động cập nhật dấu thời gian trong PostgreSQL


Tôi muốn mã có thể tự động cập nhật dấu thời gian khi một hàng mới được chèn vào như tôi có thể làm trong MySQL bằng CURRENT_TIMESTAMP.

Làm thế nào tôi có thể đạt được điều này trong PostgreSQL?

CREATE TABLE users (
    id serial not null,
    firstname varchar(100),
    middlename varchar(100),
    lastname varchar(100),
    email varchar(200),
    timestamp timestamp
)

76
2018-03-04 16:08


gốc


Nhân tiện, kiểu dữ liệu của bạn timestamp được định nghĩa bởi thông số SQL dưới dạng viết tắt của TIMESTAMP WITHOUT TIME ZONE. Đó là gần như chắc chắn không phải những gì bạn muốn, như giải thích bởi chuyên gia Postgres David E. Wheeler. Loại khác, TIMESTAMP WITH TIME ZONE có lẽ là những gì bạn muốn, sử dụng bất kỳ thông tin bù trừ múi giờ đã qua nào để điều chỉnh ngày giờ thành UTC (nhưng không thực sự lưu trữ thông tin múi giờ đó mặc dù tên loại). - Basil Bourque
Sau khi đã học lại điều này một lần nữa, tôi đã viết bài đăng blog chi tiết về việc ghi nhật ký ngày giờ tạo và sửa đổi cả hàng bằng cách sử dụng mặc định, chức năng và trình kích hoạt. Bao gồm mã SQL và PL / pgSQL mẫu hoàn chỉnh để sử dụng trong Postgres. - Basil Bourque


Các câu trả lời:


Để điền cột trong khi chèn, hãy sử dụng DEFAULT giá trị:

CREATE TABLE users (
  id serial not null,
  firstname varchar(100),
  middlename varchar(100),
  lastname varchar(100),
  email varchar(200),
  timestamp timestamp default current_timestamp
)

Lưu ý rằng giá trị cho cột đó có thể được ghi đè rõ ràng bằng cách cung cấp một giá trị trong INSERT tuyên bố. Nếu bạn muốn ngăn chặn điều đó bạn cần cò súng.

Bạn cũng cần kích hoạt nếu bạn cần cập nhật cột đó bất cứ khi nào hàng được cập nhật (như được đề cập bởi E.J. Brennan)

Lưu ý rằng việc sử dụng các từ dành riêng cho tên cột thường không phải là một ý tưởng hay. Bạn nên tìm một tên khác với timestamp


127
2018-03-04 16:23



Lưu ý rằng Postgres có chức năng để cho bạn biết (1) thời gian của thời điểm hiện tại thực tế, (2) thời gian tuyên bố bắt đầu, và (3) thời gian giao dịch bắt đầu. Ví dụ được hiển thị ở đây là bắt đầu giao dịch hiện tại. Bạn có thể hoặc không muốn điều đó trái ngược với hai khả năng khác. - Basil Bourque
Điểm thưởng tốt về việc tránh các tên va chạm với các từ dành riêng. Lưu ý rằng thông số SQL rõ ràng hứa hẹn sẽ không bao giờ sử dụng dấu gạch dưới cuối dưới dạng từ dành riêng. Vì vậy, bạn có thể thực hiện timestamp vào timestamp_. Thậm chí tốt hơn sẽ là một cái tên mô tả hơn như row_created_. - Basil Bourque
Nửa đầu không phải là những gì OP hỏi gì cả, mặc dù nửa thứ hai đề cập đến câu trả lời khác (chính xác), nhưng nó vẫn còn gây hiểu nhầm. Điều này không được chấp nhận làm câu trả lời. - Eric Wang
Nói như vậy trong tài liệu Postgres của các loại. Varchar có chu kỳ CPU phụ để kiểm tra ràng buộc, điều này không xảy ra trên TEXT. - Rahly
không phải với một trường đơn lẻ, nhưng tôi chưa bao giờ thấy một bảng hữu ích với một trường đơn lẻ. Ràng buộc này được tạo thành bởi số trường. Tôi nhớ thay đổi tất cả các varchar trong một bảng thành văn bản và đạt được một cải tiến bằng văn bản 15%. Ngoài ra, hình phạt hiệu suất nhỏ không phải là "KHÔNG" hiệu suất phạt. - Rahly


Bạn sẽ cần phải viết một kích hoạt chèn, và có thể một kích hoạt cập nhật nếu bạn muốn nó thay đổi khi hồ sơ được thay đổi. Bài viết này giải thích nó khá độc đáo:

http://www.revsys.com/blog/2006/aug/04/automatically-updating-a-timestamp-column-in-postgresql/

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

Áp dụng trình kích hoạt như thế này:

CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE  update_modified_column();

53
2018-03-04 16:16



Đây là câu trả lời hay nhất, IMO (mặc dù, mặc định là đủ để chèn). - Olivier El Mekki
Whats MỚI ở đây? - Naveen
@Naveen postgresql.org/docs/9.2/static/plpgsql-trigger.html - Tim Qian
Đây là một giải pháp hoàn chỉnh hơn sẽ làm việc với các INSERT ban đầu cũng như bất kỳ UPDATEs tiếp theo nào (tốt cho kiểm toán dữ liệu). Cấp, OP chỉ yêu cầu trước đây. - Pavel Lechev


Cập nhật dấu thời gian, chỉ khi các giá trị đã thay đổi

Dựa trên liên kết của E.J và thêm câu lệnh if từ liên kết này (https://stackoverflow.com/a/3084254/1526023)

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
   IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
      NEW.modified = now(); 
      RETURN NEW;
   ELSE
      RETURN OLD;
   END IF;
END;
$$ language 'plpgsql';

35
2017-10-09 17:40





Sử dụng 'now ()' làm giá trị mặc định sẽ tự động tạo ra dấu thời gian.


4
2018-06-06 19:29