运行一个子查询决定是否跳过外层查询,跳过不传参数?

Run a subquery to decide whether to skip outer query, don't send parameters if skipped?

我在 Java JDBC

中使用了以下查询
INSERT INTO account_photos (token, image, image_id, order_count) SELECT ?, ?, ?, ?  WHERE NOT EXISTS (SELECT 1 from account_photos where image_id = ?)

即使 image_id 在 table 中,它在获得 image 时似乎会导致非常高的服务器负载和带宽使用。

如果 NOT EXISTS 不正确,是否有办法不获取图像?

在此查询中,图像数据将在查询开始前传输到服务器。查询处理分阶段进行:

  • 解析:从客户端读取查询文本,验证其语法并将其转化为描述查询的内部结构
  • 绑定:从客户端读取查询参数并将它们与已解析查询
  • 中的占位符匹配
  • 执行:实际运行查询

IF NOT EXISTS (SELECT ...)发生在执行阶段。绑定阶段已经完成,这是图像数据通过网络传输临时存储在数据库服务器内存中的绑定阶段。

您不能在绑定参数之前使 PostgreSQL 运行 成为查询的一部分。 PostgreSQL 不支持惰性参数绑定,它只在查询需要时才回调客户端请求参数数据。这从根本上说没有什么不可能,只是当前的 PostgreSQL 协议、客户端驱动程序或数据库服务器不支持它。

因此,您必须分两个阶段执行此操作,作为两个单独的查询。检查图片是否存在,不存在才插入

注意:您的查询可以尝试插入图像两次,因为两个并发查询都可以 return false for not exists (select...),并且因此都可以进行 insert.