Postgresql Текущее время на обновлении - PullRequest
19 голосов
/ 02 марта 2010

Что такое 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
);

В соответствии с ответом Алекса Брасетвика ниже, мне кажется, что я должен идти с триггерами, моя проблема в том, что у меня есть несколько таблиц 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();

Ответы [ 3 ]

18 голосов
/ 02 марта 2010

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

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();
9 голосов
/ 20 апреля 2012

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

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

4 голосов
/ 02 марта 2010

Обновите его с помощью триггера. Документация и примеры .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...