什么是postgres相当于下面的mysql代码
CREATE TABLE t1 (
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE t2 (
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)
根据Alex Brasetvik在下面的回答,似乎我应该使用触发器,我的问题是我有一些表t1,t2 ...有创建和修改的字段,是否可以编写一个通用程序?
--update几乎准备好了
CREATE FUNCTION update_timestamp() RETURNS trigger AS $update_timestamp$
BEGIN
NEW.modified := current_timestamp;
RETURN NEW;
END;
$update_timestamp$ LANGUAGE plpgsql;
CREATE TRIGGER update_timestamp BEFORE INSERT OR UPDATE ON t1
FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
CREATE TRIGGER update_timestamp BEFORE INSERT OR UPDATE ON t2
FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
Run Code Online (Sandbox Code Playgroud)
Fra*_*ens 18
只需确保所有表都具有相同的列名:
CREATE OR REPLACE FUNCTION upd_timestamp() RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
BEGIN
NEW.modified = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$;
CREATE TRIGGER t_name
BEFORE UPDATE
ON tablename
FOR EACH ROW
EXECUTE PROCEDURE upd_timestamp();
Run Code Online (Sandbox Code Playgroud)
小智 9
感谢您提供Mithun和Alex Brasetvik的信息.
我想在触发器上添加一个小调整.由于我们很可能希望修改的列在上次更改行时存储时间戳,而不是在它是UPDATE语句的目标时,我们必须比较行的新值和旧值.仅当这两个值不同时,我们才更新修改后的列.
CREATE OR REPLACE FUNCTION update_modified_timestamp() RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
BEGIN
IF (NEW != OLD) THEN
NEW.modified = CURRENT_TIMESTAMP;
RETURN NEW;
END IF;
RETURN OLD;
END;
$$;
Run Code Online (Sandbox Code Playgroud)
此触发器确保仅在UPDATE操作实际更改存储在行中的值时才更新已修改的列.