Aar*_*ron 103 database postgresql
我希望代码能够在插入新行时自动更新时间戳,因为我可以使用CURRENT_TIMESTAMP在MySQL中执行此操作.
我怎样才能在PostgreSQL中实现这一目标?
CREATE TABLE users (
id serial not null,
firstname varchar(100),
middlename varchar(100),
lastname varchar(100),
email varchar(200),
timestamp timestamp
)
Run Code Online (Sandbox Code Playgroud)
a_h*_*ame 165
要在插入期间填充列,请使用以下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
)
Run Code Online (Sandbox Code Playgroud)
请注意,可以通过在INSERT语句中提供值来显式覆盖该列的值.如果你想防止你需要一个触发器.
如果需要在更新行时更新该列,则还需要触发器(如EJ Brennan所述)
请注意,对列名使用保留字通常不是一个好主意.你应该找到一个不同的名字timestamp
E.J*_*nan 82
您需要编写插入触发器,如果您希望在更改记录时更改它,则可能需要更新触发器.这篇文章很好地解释了它:
http://www.revsys.com/blog/2006/aug/04/automatically-updating-a-timestamp-column-in-postgresql/
Run Code Online (Sandbox Code Playgroud)CREATE OR REPLACE FUNCTION update_modified_column() RETURNS TRIGGER AS $$ BEGIN NEW.modified = now(); RETURN NEW; END; $$ language 'plpgsql';像这样应用触发器:
Run Code Online (Sandbox Code Playgroud)CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE update_modified_column();
小智 46
仅在值更改时更新时间戳
基于EJ的链接并从此链接添加if语句(/sf/answers/215897811/)
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';
Run Code Online (Sandbox Code Playgroud)
要在插入新行时自动更新 PostgresSQL 中的时间戳字段,您可以设置 为其current_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
)
Run Code Online (Sandbox Code Playgroud)
除此之外,您可能希望阻止任何人将来更新此字段,这可以通过创建更新触发器并应用它来完成:
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$
Run Code Online (Sandbox Code Playgroud)
CREATE TRIGGER prevent_timestamp_changes
BEFORE UPDATE
ON users
FOR EACH ROW
EXECUTE PROCEDURE stop_change_on_timestamp();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
117510 次 |
| 最近记录: |