我有一张这样的表:
CREATE TABLE bla (
id BIGSERIAL PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 1
updated_at TIMESTAMP, -- 2
deleted_at TIMESTAMP, -- 3
restored_at TIMESTAMP, -- 4
created_by BIGINT,
updated_by BIGINT,
deleted_by BIGINT,
restored_by BIGINT,
is_deleted BOOLEAN DEFAULT FALSE,
unique_id VARCHAR(20) UNIQUE,
data TEXT
);
仅使用默认PostgreSQL
功能,如何:
1
。自动填写created_at
上的INSERT
?
的完成
2
。自动填写updated_at
上的UPDATE
(仅在更新unique_id
和data
时)?的完成
CREATE OR REPLACE FUNCTION change_updated_at() RETURNS trigger AS $$
DECLARE
changed BOOLEAN;
BEGIN
changed := FALSE;
IF (OLD.unique_id <> NEW.unique_id) OR (OLD.data <> NEW.data) THEN
changed := TRUE;
END IF;
IF changed THEN
NEW.updated_at := NOW();
END IF;
RETURN NEW;
END; $$ LANGUAGE plpgsql;
CREATE TRIGGER bla__updated_at_trigger BEFORE UPDATE ON bla FOR EACH ROW EXECUTE PROCEDURE change_updated_at();
3
。 deleted_at
成为UPDATE
后,is_deleted
会自动填写true
吗?
4
。 restored_at
成为UPDATE
后,is_deleted
会自动填写false
吗?
我会在成功尝试后更新此帖子。
答案 0 :(得分:1)
检查这样的条件。如果我理解正确吗?
if tg_op='UPDATE' then
update table set update_at=CURRENT_TIMESTAMP;
if old.is_deleted=false and new.is_deleted=true then
update table set deleted_at=CURRENT_TIMESTAMP;
end if;
if old.is_deleted=true and new.is_deleted=false then
update table set restored_at=CURRENT_TIMESTAMP;
end if;
end if;
答案 1 :(得分:0)
答案是
CREATE OR REPLACE FUNCTION change_updated_at() RETURNS trigger AS $$
DECLARE
changed BOOLEAN;
BEGIN
changed := FALSE;
IF (OLD.unique_id <> NEW.unique_id) OR (OLD.data <> NEW.data) THEN
changed := TRUE;
END IF;
IF changed THEN
NEW.updated_at := NOW();
END IF;
IF (OLD.is_deleted = TRUE) AND (NEW.is_deleted = FALSE) THEN
NEW.restored_at := NOW();
END IF;
IF (OLD.is_deleted = FALSE) AND (NEW.is_deleted = TRUE) THEN
NEW.deleted_at := NOW();
END IF;
RETURN NEW;
END; $$ LANGUAGE plpgsql;