2012-03-04 40 views
68

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

Làm cách nào để 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 
) 
+2

Nhân tiện, kiểu dữ liệu của bạn của dấu thời gian được xác định bởi thông số SQL làm chữ 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] (http://justatheory.com/computers/databases/postgresql/use-timestamptz.html). 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ù giờ múi giờ đã qua để điều chỉnh ngày giờ thành [UTC] (http://en.wikipedia.org/wiki/Coordinated_Universal_Time) (nhưng không thực sự lưu trữ thông tin múi giờ đó mặc dù tên loại). –

+1

Sau khi đã học lại điều này một lần nữa, tôi đã viết một [bài đăng blog chi tiết] (http://crafted-software.blogspot.com/2014/10/track-date-time-of-row-creation.html) về 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, hàm 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. –

Trả lời

114

Để cư cột trong chèn, sử dụng giá trị DEFAULT:

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 câu lệnh INSERT. Nếu bạn muốn ngăn chặn rằng bạn cần một trigger.

Bạn cũng cần một 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ư mentioned by E.J. Brennan)

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

+4

Hãy lưu ý rằng Postgres có [chức năng] (http://www.postgresql.org/docs/current/static/functions-datetime.html) để 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. –

+2

Điểm thưởng tốt về cách 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ể đặt 'dấu thời gian' thành' dấu thời gian_'.Thậm chí tốt hơn sẽ là một tên mô tả hơn như là 'row_created_'. –

+0

Nửa đầu không phải là những gì OP hỏi gì cả, mặc dù nửa thứ hai được gọi là câu trả lời khác (đúng là 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. –

43

Bạn cần phải viết trình kích hoạt chèn và có thể kích hoạt cập nhật nếu bạn muốn thay đổi khi thay đổi bản ghi. 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 cò như thế này:

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

Đây là câu trả lời hay nhất, IMO (mặc dù, mặc định là đủ để chèn). –

31

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

Dựa vào liên kết EJ và thêm một 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'; 
3

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

Các vấn đề liên quan