我有以下在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不正确,有没有得到图像?
答案 0 :(得分:1)
在此查询中,图像数据将在查询开始之前传输到服务器 。查询处理分阶段进行:
IF NOT EXISTS (SELECT ...)
在执行阶段发生。绑定阶段已经完成,它是绑定阶段,图像数据通过网络传输,暂时存储在数据库服务器的内存中。
在绑定参数之前,不能使PostgreSQL运行部分查询。 PostgreSQL不支持延迟参数绑定,它只在查询需要时回调客户端询问参数数据。对此没有根本不可能,它只是当前的PostgreSQL协议,客户端驱动程序或数据库服务器不支持。
因此,您必须分两个阶段执行此操作,作为两个单独的查询。检查图像是否存在,只有当图像不存在时才插入。
注意:您的查询可以尝试两次插入图片,因为两个并发查询都可以返回false
not exists (select...)
,因此可以继续insert
}。