Postgresql - 为重新运行的插入脚本生成不存在条件的动态条件

时间:2018-05-28 15:18:08

标签: postgresql sqlite postgresql-9.3

我需要在postgres中为数据库中的所有表生成Insert脚本,以便可以再次运行它而不会抛出任何错误。 问题是,只有少数表具有主键,而其余表具有不同列上的唯一索引。

这就是为什么我无法列出已创建唯一索引的列。 这背后的原因是模式是通过Magnolia自动创建的。

任何人都可以帮我写出产生插入声明的查询,包括“不存在的地方(从表格中选择1,其中列=值)'基于主键/唯一列的条件?

2 个答案:

答案 0 :(得分:0)

您可以使用on conflict

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

答案 1 :(得分:0)

此函数返回数据的插入脚本,适用于主要约束不可用的表。 我通过向其添加条件来修改我在另一个线程上找到的代码。

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;