Postgresql
PostgreSQL:使用自定義列自動更新 updated_at
以前,我會將多個表合併為一個並返回結果,但在許多表中我有相同的列名。這就是為什麼我決定在列名前加上表名。但這打破了我不得不自動更新我的
updated_at
專欄的觸發器。這是我的功能:
CREATE OR REPLACE FUNCTION update_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = now(); RETURN NEW; END; $$ language 'plpgsql';
我會添加一個觸發器,例如:
CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
但是現在我的專欄被命名了
users_updated_at
,這不起作用。我的問題是有什麼方法可以將列名傳遞給觸發器並更新傳遞的列,還是有其他我不知道的方法?
使用spi 模組的
moddatetime
spi 模組,moddatetime
moddatetime - 跟踪上次修改時間的函式
moddatetime() 是將目前時間儲存到
timestamp
欄位中的觸發器。這對於跟踪表中特定行的最後修改時間很有用。要使用,請使用此函式創建一個 BEFORE UPDATE 觸發器。指定單個觸發器參數:要修改的列的名稱。該列的類型必須為時間戳或帶時區的時間戳。
moddatetime.example中有一個範例。
範例/概要
從上面引用的文件中,
DROP TABLE mdt; CREATE TABLE mdt ( id int4, idesc text, moddate timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL ); CREATE TRIGGER mdt_moddatetime BEFORE UPDATE ON mdt FOR EACH ROW EXECUTE PROCEDURE moddatetime (moddate); INSERT INTO mdt VALUES (1, 'first'); INSERT INTO mdt VALUES (2, 'second'); INSERT INTO mdt VALUES (3, 'third'); SELECT * FROM mdt; UPDATE mdt SET id = 4 WHERE id = 1; UPDATE mdt SET id = 5 WHERE id = 2; UPDATE mdt SET id = 6 WHERE id = 3; SELECT * FROM mdt;
你的申請
所以這就是你需要的。
CREATE EXTENSION spi; ALTER TABLE users ALTER timestamp_at SET DEFAULT now(); DROP TRIGGER IF EXISTS update_users_updated_at ON users; CREATE TRIGGER mdt_users BEFORE UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE moddatetime (timestamp_at);