如何随机删除SQLite表中的20%的行

Fra*_*ank 7 sqlite

下午好,我们想知道如何随机删除sqlite表中20%的行,行数为15000行.我们注意到这个问题在使用SQL Server的Stack Overflow中解决了 从SQL Server表中选择n个随机行.但SQL Server脚本似乎在sqlite中无法正常运行.我们如何将SQL Server脚本转换为sqlite等效脚本?谢谢.

Wil*_*l A 5

不是很“随机” - 但如果你在表上有一个标识列,你可以DELETE FROM mytable WHERE ID % 5 = 0从统计上删除非常接近五分之一的行。


kar*_*ora 5

或者,由于sqlite中的random()函数返回带符号的64位整数,我们可以将此空间中的点计算为(2 ^ 63)*0.6.大于此的有符号整数将是正有符号64位整数集的40%,因此占整数的20%.

截断到下面的整数,这是5534023222112865484.

因此,您应该能够通过简单的方式获得20%的行:

   SELECT * FROM table WHERE random() > 5534023222112865485
Run Code Online (Sandbox Code Playgroud)

或者在您的情况下,因为您要删除那么多:

   DELETE FROM table WHERE random() > 5534023222112865485
Run Code Online (Sandbox Code Playgroud)

我希望你喜欢这种方法.如果您希望从这样的操作中获得高性能,它实际上可能是合适的,但它可能依赖于硬件/版本,因此可能不值得冒这个风险.

  • 作为一般的良好实践,您不应该关心ROWID的实际值,以及序列中是否存在间隙.由于各种原因,数据库在任何情况下都可能在正常使用过程中的序列中出现间隙.例如,当你开始; 插入; 插入; 承诺; 你在BEGIN的一个线程中; 插入; ROLLBACK; 在另一个线程中,你最终可能会在ROWID中出现间隙. (3认同)
  • 另外,正如有人在下面的评论中指出的那样,使用WHERE(random()%5)= 0确实是一个更好的解决方案,因为它不需要花哨计算64位有符号int的大小,并且它没有可能依赖于硬件/版本. (2认同)