我想执行以下操作:
delete from images where image_address not in (<a long list>)
这份清单可以有多长?(我猜我可能不得不考虑另一种方式)。
如果您使用参数 ( ?
),默认情况下最大数量为 999。
如果您通过直接插入值来动态创建 SQL 语句(这对字符串来说是一件坏事),那么这样的列表的长度没有上限。但是,整个 SQL 语句的长度是有限制的,默认为一百万字节。
如果您不能保证您的查询不超过这些限制,则必须使用临时表(请参阅 LS_dev 的答案)。
如果您的清单很长,我会建议两种方法:
第一个解决方案:
将所有数据添加到临时表:
CREATE TEMP TABLE lng_list(image_address);
-- Insert all you elements in lng_list table
-- ...
DELETE FROM images WHERE image_address NOT IN (SELECT image_address FROM lng_list);
确保使用此内部事务以获得良好的性能。
第二种解决方案:
(已移除:仅适用于IN
,不适用于NOT IN
...)
对于任何这些解决方案,性能都应该是相当好的。