我有一个包含辅助实体列表的客户端实体,这在数据库上表示为外键约束。
客户端创建形式允许一次创建主实体及其子实体,因此在 DB 端可能必须在一个事务中同时保存一个新的主实体和一些新的子实体。出于这个原因,我想使用存储过程 DB-side,最直接的方法似乎是将主实体的字段作为参数传递,子实体作为某种集合参数(可能是 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.
有没有办法使用单个多行插入,或者我应该回退到一个一个地插入值?我认为多行插入实际上并不只是重复执行单行插入,而且与逐行插入相比,使用它会有一些好处。当然,我宁愿避免扭曲的变通方法,这些变通方法会减慢操作速度,超出多行插入带来的好处。
您可以将元组打包在 a 中json[]
并在INSERT
语句中解析它们,但我真的不明白这一点。
我只会INSERT
为每个实体运行单行语句。
我猜你担心性能,但也许所有的解析和解析都会超过在单个语句中插入所有内容的优势。
除此之外,我希望INSERT
通过循环中的简单s使代码更清晰、更易于维护。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句