Подтвердить что ты не робот

Postgresql Текущая временная метка обновления

Что такое эквивалент 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
);

В соответствии с Alex Brasetvik ниже, кажется, я должен идти с триггерами, моя проблема в том, что у меня есть несколько таблиц t1, t2... с созданными и измененными полями, можно ли написать обобщенную процедуру?

- обновление Почти готов

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

Ответ 1

Просто убедитесь, что все таблицы имеют одинаковое имя столбца:

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

Ответ 2

Спасибо за информацию Митхун и Алекс Брасетвик.

Я хочу добавить одну мелодию к триггеру. Поскольку мы, скорее всего, хотим, чтобы столбец изменен сохранял метку времени, когда последняя строка была изменена, а не когда она была целью оператора 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;
$$;

Этот триггер гарантирует, что измененный столбец обновляется, только если операция UPDATE фактически изменяет значения, хранящиеся в строке.