Обновлять столбец ссылкой на внешний ключ, только если значение не равно NULL - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть следующие две таблицы:

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 только когда передано ненулевое значение и оставить его без изменений в противном случае?

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