Есть ли способ добавить ограничение обновления для столбца при создании таблицы в Postgresql? - PullRequest
0 голосов
/ 09 июля 2020

Я хотел сделать это в таблице в Postgresql 9.4, чтобы автоматически обновить столбец в операторе обновления, как это работает в MySQL 5.6 без триггера?

create table test
(
id varchar(10),
updated timestamp not null default now() ON UPDATE now()
)

Postgresql выдает ошибку на слове ВКЛ перед ОБНОВЛЕНИЕМ

ОШИБКА: синтаксическая ошибка при или около «ВКЛ» SQL состояние: 42601 Символ: 133

1 Ответ

1 голос
/ 09 июля 2020

Конечно, есть некоторые накладные расходы на триггеры, но обычно они незначительны. (Параметр c# также будет иметь небольшие накладные расходы на код и небольшие накладные расходы на сеть, поэтому, вероятно, это будет подбрасывание). Также в некоторой степени зависит от вашего определения «огромного объема транзакций в день». Это десятки тысяч транзакций в день или десятки тысяч транзакций в секунду. Часто огромное - это относительно небольшое число. Единственный способ узнать наверняка - это протестировать его (убедитесь, что вы фиксируете общее прошедшее время, а не только время в базе данных). Синтаксис триггера в Postgres кардинально отличается от MySql. В Postgres вы создаете функцию специального типа (возвращает триггер). Сам триггер представляет собой единый оператор, выполняющий функцию. С MySql код находится непосредственно в определении триггера (точно так же, как Oracle - фактически, пока Oracle не купил его MySql не поддерживал триггеры.) Приятным преимуществом здесь является то, что эту единственную функцию может использовать любой таблица, которая реализует то же имя столбца (по крайней мере, в этом случае).

create or replace 
function set_updated_timestamp()
 returns trigger 
 language plpgsql
as $$
begin   
    new.updated = now();
    return new;
end;
$$;

См. полный пример fiddle . Примечание: Postgres версия 9.4 больше не поддерживается , я предлагаю выполнить обновление как можно скорее. Для скрипки я использовал версию 9.5, так как это самая старая доступная версия. Также, если скрипка работает медленно, это связано с операторами "select sleep", а НЕ с триггером. Я не думаю, что "db <> fiddle" действительно уважает эти утверждения.

...