У меня есть следующие две таблицы:
CREATE TABLE public.table_b (
id serial primary key,
str character varying NOT NULL
);
CREATE TABLE public.table_a (
id serial primary key,
mystring character varying NOT NULL,
foreignstring integer NOT NULL references table_b (id)
);
insert into table_b (str) values ('foreign sample');
insert into table_a (mystring, foreignstring) values ('my sample', (select id from table_b where str = 'foreign sample'));
Я хотел бы обновить некоторые значения table_a следующей функцией:
CREATE OR REPLACE FUNCTION public.update_row(
_id int,
_mystring varchar,
_fkstr varchar
)
RETURNS void AS
$BODY$
DECLARE
_var int;
BEGIN
loop
select id from table_b where str = _fkstr into _var;
exit when FOUND;
insert into table_b (str) values (_fkstr)
on conflict do nothing
returning id
into _var;
exit when FOUND;
end loop;
update table_a set
mystring = coalesce(_mystring, mystring),
foreignstring = _var
where
id = _id
;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Функция должна обновлять только те значения, которыене передается как ноль.Если передано значение null
, старое значение не должно быть изменено.Это прекрасно работает, если столбец с внешней ссылкой не получает значение null
:
select update_row(1, null, 'foreign example'); -- ok
Если я не хочу изменять столбец foreignstring
и передать значение null
, товызов функции завершается неудачно, потому что он пытается вставить null
в table_b:
select update_row(1, null, null); -- fails
Как я могу обновить foreignstring
только когда передано ненулевое значение и оставить его без изменений в противном случае?