Postgresql - Генерирование условия «где нет» динамически для повторно запускаемого сценария вставки - PullRequest
0 голосов
/ 28 мая 2018

Мне нужно сгенерировать скрипт вставки в postgres для всех таблиц в базе данных, чтобы он мог быть запущен снова без каких-либо ошибок.Проблема в том, что только несколько таблиц имеют первичный ключ, в то время как остальные имеют уникальный индекс для разных столбцов.

Вот почему я не могу перечислить столбцы, по которым был создан уникальный индекс.Причиной этого является то, что схема автоматически создается с помощью Магнолии.

Может ли кто-нибудь помочь мне написать запрос, который производит оператор вставки, включающий условие «Где не существует (выберите 1 из таблицы, где столбец = значение)» на основе столбцов Первичный ключ / Уникальный?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Эта функция возвращает скрипт вставки для данных и хорошо работает с таблицами, для которых основное ограничение недоступно.Я изменил код, найденный в другом потоке, добавив к нему условие.

CREATE OR REPLACE FUNCTION public.generate_inserts(varSchema text, varTable text) RETURNS TABLE(resultado text) AS $$

DECLARE CODE TEXT;

BEGIN
CODE :=
(
SELECT
'SELECT ''INSERT INTO '
|| table_schema || '.'
|| table_name ||' ('
|| replace(replace(array_agg(column_name::text)::text,'{',''),'}','') || ') SELECT ''||'
|| replace(replace(replace(array_agg( 'quote_nullable(' || column_name::text || ')')::text,'{',''),'}',''),',',' || '','' || ')
|| ' || '' Where Not Exists (Select 1 From ' || table_name ||' Where 1 = 1 ' 
|| ''''
|| replace(replace(replace(replace(array_agg(' || '' and (' || column_name::text || ' = '' || quote_nullable(' || column_name::text || '),' || ' || '' or ' || column_name::text || ' is null)''')::text,'{',''),'}',''),'"',''),',','')
|| '|| '');'''
|| ' FROM ' || table_schema || '.' || table_name || ';'
FROM information_schema.columns c 
WHERE table_schema = varSchema
AND table_name = varTable
GROUP BY table_schema, table_name);



RETURN QUERY
EXECUTE CODE;
END;
$$ LANGUAGE plpgsql;
0 голосов
/ 28 мая 2018

Вы можете использовать on conflict:

insert into t ( . . . )
    values ( . . . )
    on conflict do nothing;
...