如何在Informix中使用rowid和first来限制查询中删除的行数



我可以执行以下语句来获得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。

相关内容

  • 没有找到相关文章

最新更新