我可以执行以下语句来获得rowid列表:
select first 1000 rowid from table1 where last_update < today-30;
但是我不能用它作为delete语句的子查询:
delete from table1
where rowid in ( select first 1000 rowid from table1
where last_update < today-30 );
它给了我这个错误:
944:无法使用"首先"极限;或";跳过";在这种情况下
如何修复?
如注释中所述,子查询中不允许使用FIRST、LIMIT和SKIP子句。这是令人讨厌的缺乏一致性。
你提到的解决方法是:
DROP TABLE IF EXISTS temp_rowid_list;
SELECT FIRST 1000 ROWID
FROM table1
WHERE last_update < today - 30
INTO TEMP temp_rowid_list;
DELETE FROM table1 WHERE ROWID IN (SELECT * FROM temp_rowid_list);
DROP TABLE IF EXISTS temp_rowid_list;
除非使用REPEATABLE READ隔离运行,否则存在TOCTOU(检查时间,使用时间(风险,因为在SELECT和DELETE操作之间,由临时表中的ROWID值标识的主表中的一些行可能已经更改。有一个很小的可能性,一个旧的行可能已经被删除,一个新的行插入了相同的ROWID。