#postgresql #triggers #plpgsql
Вопрос:
У меня есть таблица, в которой строки, описываемые уникальным идентификатором, должны обновляться из автоматического процесса на регулярной основе.
INSERT INTO mytable(x,y,z) ON CONFLICT(x) DO UPDATE SET y=A...
ПРИМЕР ИСПОЛЬЗОВАНИЯ :
Некоторые строки еще не имеют значения, в следующем цикле могут быть установлены некоторые значения.
В других строках уже есть значения, но в следующем цикле могут быть пустые значения для обновления. В этом случае я не хочу, чтобы нулевые значения заменяли текущие значения.
Я создал этот триггер :
CREATE OR REPLACE FUNCTION public.clean_update()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
BEGIN
NEW.company = COALESCE(NEW.company,OLD.company);
NEW.first_name = COALESCE(NEW.first_name,OLD.first_name);
NEW.last_name = COALESCE(NEW.last_name,OLD.last_name);
NEW.address = COALESCE(NEW.address,OLD.address);
NEW.country = COALESCE(NEW.country,OLD.country);
NEW.phone = COALESCE(NEW.phone,OLD.phone);
NEW.mail = COALESCE(NEW.mail,OLD.mail);
NEW.evaluation = COALESCE(NEW.evaluation,OLD.evaluation);
NEW.positive = COALESCE(NEW.positive,OLD.positive);
NEW.neutral = COALESCE(NEW.neutral,OLD.neutral);
NEW.negative = COALESCE(NEW.negative,OLD.negative);
NEW.nb_products = COALESCE(NEW.nb_products,OLD.nb_products);
NEW.nb_sales = COALESCE(NEW.nb_sales,OLD.nb_sales);
NEW.nb_sale_url = COALESCE(NEW.nb_sale_url,OLD.nb_sale_url);
NEW.unregistered = COALESCE(NEW.unregistered,OLD.unregistered);
RETURN NEW;
END;
$BODY$;
С помощью этого триггера обновленное значение не заменяется, если его НОВОЕ значение равно NULL, отлично.
Проблема возникает при обновлении только некоторых столбцов :
ERROR: record "new" has no field "nb_sale_url"
Есть ли способ проверить, существует ли событие NEW.x, если оно равно нулю ?
Или, может быть, есть более простой способ сделать это
Комментарии:
1. Очевидно , в вашей таблице нет имени столбца
nb_sale_url
, поэтому, очевидно, вы не можете присвоить ему значение.2. Добавьте фактическое определение триггера в свой вопрос. Также это:
INSERT INTO mytable(x,y,z) SET y=A ON CONFLICT(x) DO UPDATE SET...
не имеет смысла, вы не можетеSET
в этойINSERT
части.3. Вы могли бы уловить ошибку.