我需要在postgres中为数据库中的所有表生成Insert脚本,以便可以再次运行它而不会抛出任何错误。 问题是,只有少数表具有主键,而其余表具有不同列上的唯一索引。
这就是为什么我无法列出已创建唯一索引的列。 这背后的原因是模式是通过Magnolia自动创建的。
任何人都可以帮我写出产生插入声明的查询,包括“不存在的地方(从表格中选择1,其中列=值)'基于主键/唯一列的条件?
答案 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;