运行子查询以决定是否跳过外部查询,如果跳过则不发送参数?

时间:2015-09-05 20:45:08

标签: java postgresql jdbc subquery query-parameters

我有以下在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在表中,它也会导致服务器负载和带宽占用率过高,因为它会获得image_id

如果NOT EXISTS不正确,有没有得到图像?

1 个答案:

答案 0 :(得分:1)

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

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

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

在绑定参数之前,不能使PostgreSQL运行部分查询。 PostgreSQL不支持延迟参数绑定,它只在查询需要时回调客户端询问参数数据。对此没有根本不可能,它只是当前的PostgreSQL协议,客户端驱动程序或数据库服务器不支持。

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

注意:您的查询可以尝试两次插入图片,因为两个并发查询都可以返回false not exists (select...),因此可以继续insert }。