我希望代码能够自动更新时间戳时,一个新的行插入,因为我可以在MySQL中使用CURRENT_TIMESTAMP。
我将如何在PostgreSQL中实现这一点?
CREATE TABLE users (
id serial not null,
firstname varchar(100),
middlename varchar(100),
lastname varchar(100),
email varchar(200),
timestamp timestamp
)
要在插入期间填充列,请使用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
)
注意,可以通过在INSERT语句中提供一个值显式地覆盖该列的值。如果你想防止这种情况发生,你确实需要一个诱因。
如果您需要在行更新时更新该列,则还需要一个触发器(正如E.J. Brennan所提到的)。
注意,对列名使用保留字通常不是一个好主意。您应该找到一个与时间戳不同的名称
要在插入新行时自动更新PostgresSQL中的时间戳字段,可以将current_timestamp设置为默认值:
CREATE TABLE users (
id serial not null,
firstname varchar(100),
middlename varchar(100),
lastname varchar(100),
email varchar(200),
timestamp timestamp default current_timestamp
)
除此之外,你可能想要阻止任何人在未来更新这个字段,这可以通过创建一个更新触发器并应用它来完成:
CREATE OR REPLACE FUNCTION stop_change_on_timestamp()
RETURNS trigger AS
$BODY$
BEGIN
-- always reset the timestamp to the old value ("actual creation time")
NEW.timestamp := OLD.timestamp;
RETURN NEW;
END;
$BODY$
CREATE TRIGGER prevent_timestamp_changes
BEFORE UPDATE
ON users
FOR EACH ROW
EXECUTE PROCEDURE stop_change_on_timestamp();