PostgreSQL-存储过程中的多个插入

时间:2018-09-19 12:04:37

标签: postgresql stored-procedures bulkinsert insert-update

我有一个客户端实体,其中包含一个辅助实体列表,并且在数据库上将其表示为外键约束。

客户端创建表单允许一次创建主实体及其子实体,因此在DB端可能必须在一个事务中同时保存一个新的主实体和一些新的子实体。因此,我想使用存储过程数据库端,最直接的方法似乎是将主实体的字段作为参数传递,而将子实体作为某些对象的集合参数排序(可能是json字符串,以说明子实体数据的异质性)。

在存储过程中,首先保存主实体,然后保存子实体,可能使用新生成的主实体ID(据我所知,该过程本身作为事务,并且写入主要实体失败后将回滚所述插入/更新。

我的问题在于保存子实体(此处仅是“实体”)。虽然我知道,对于现有实体 我需要自己运行每个更新,但我想对新实体使用多行插入语法。出于这个原因,我想构建一个准备好的语句,在其中可以随着实体列表的长度的变化而增加插入的元组的列表,如INSERT INTO ... VALUES <tuple1>, <tuple2>, ...中那样,这带来了痛苦...

当然,将来自每个实体的原始值连接起来以构建查询字符串当然是最简单的,这邀请了SQL注入。

另一方面,虽然我可以使用$表示法构建插入语句,但是在执行它,连接参数时会遇到问题,即:

-- prepare insert statement stmt

EXECUTE stmt USING <???> -- variable number of parameters to wire, 
                         -- I don't know how to work around it.

是否有使用单个多行插入的方法,还是我应该退一步来逐个插入值?我假设多行插入实际上并不会重复执行单行插入,并且使用它比一对一方法会有一些好处。当然,我宁愿避免使用扭曲的解决方法,因为这种方法会减慢操作速度,超出多行插入所带来的好处。

1 个答案:

答案 0 :(得分:1)

您可以将元组打包在json[]中,并在INSERT语句中进行删除,但我并不明白这一点。

我只为每个实体运行单行INSERT语句。

我猜您可能担心性能,但是解析和解析的所有好处可能超过将所有内容插入单个语句的优势。

除此之外,我希望通过循环中的简单INSERT可以使代码更简洁,更易于维护。