【发布时间】:2015-06-23 08:28:16
【问题描述】:
在除 Postgres 之外的 SQL 系统中,例如 MySQL,预准备语句可以使用问号 ? 作为预准备语句中数据的占位符。
INSERT INTO foo (id, name) VALUES (?, ?), (?, ?);
但是,在 Postgres 中,唯一可用的占位符似乎是编号占位符,所以上面的 INSERT Postgres 语句看起来像:
INSERT INTO foo (id, name) VALUES ($1, $2), ($3, $4);
当我尝试在一个语句中插入大量行时,就会出现这种语法的问题,对于 10,000 行和 10 列,我必须有范围为 $1 to $100,000 的占位符,这会导致 3-4 折查询大小增加。
Postgres 是否支持任何类型的未编号和未命名占位符用于准备好的语句?
编辑:
我正在使用准备好的语句,因为它们可以防御 SQL 注入。所以我的目标是在保持插入过程安全的同时尽可能快地保持批量插入。
【问题讨论】:
-
只创建一次准备好的语句,使用 $1 和 $2,并执行多次。
-
为什么查询语句大小有问题?
-
@FrankHeikens 多次执行准备好的语句似乎没有多行 INSERT 语句提供的更快批量插入的优势。
-
准备好的语句是为了获得更好的性能,除非您在每个语句之后都提交。启动事务,创建准备好的语句,执行多次,提交。而已。安全快捷。
-
@FrankHeikens 交易确实使多次执行非常快
标签: postgresql