当列Y切换时,PostgreSQL更新列X.

时间:2014-12-12 04:22:04

标签: postgresql triggers

我有一张这样的表:

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_iddata时)?的完成

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();

3deleted_at成为UPDATE后,is_deleted会自动填写true吗?

4restored_at成为UPDATE后,is_deleted会自动填写false吗?

我会在成功尝试后更新此帖子。

2 个答案:

答案 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;