Триггер Postgresql проверяет, является ли значение NULL

#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. Вы могли бы уловить ошибку.