我想从文件夹中的DB文件中删除一堆行。连接和计算db文件中的行数有效,但当我尝试删除特定数量的行时,我会卡住。
输入:
sql = "SELECT COUNT(*) AS id FROM wifi_probe_requests";
...
sql = "DELETE FROM wifi_probe_requests LIMIT " + rowcount/2;
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
输出:
54943
[SQLITE_ERROR] SQL error or missing database (near "LIMIT": syntax error)
不使用限制工作正常,我可以删除整个数据库表,但我想要的是删除我所制作的rowcount / 2所看到的一半数据库行。
更新:
到目前为止,我已经通过找到位于n行/ 2的id然后得到它的值(例如264352)解决了这个问题。然后使用该数字来指示将删除哪些id行(例如id.value< 264352)。
sql = "SELECT COUNT(*) AS id FROM wifi_probe_requests";
int rowcount = COUNT(*);
sql = "DELETE FROM wifi_probe_requests WHERE id < (SELECT id FROM wifi_probe_requests ORDER BY id ASC LIMIT "+ rowcount/2 + ",1)";
rowcount = 50000
Delete valueof.id < valueof.id.50000/2
因此,将删除低于位置25000处的id值的所有id值。
答案 0 :(得分:1)
你做不到。某些数据库不允许在UPDATE
或DELETE
个查询中WHERE id < [middle id]
。
似乎使用SQLite可以通过Robert mentioned来解决这个问题,但是如果你不愿意这样做,你需要以不同的方式重写你的查询。例如,如果表格中有自动增量ID,则可以计算“中间”ID,并使用LIMIT
替代CREATE TABLE user (fname string,lname string) partitioned By (day int);
。
答案 1 :(得分:1)
如@Kayaman所述,使用SQLITE是不可能的。 您可以通过诸如;
之类的查询来绕过此问题DELETE FROM wifi_probe_requests WHERE id IN (SELECT id FROM wifi_probe_requests LIMIT 10)
还有一件事;我不认为(rowcount / 2)在行数不均匀时会起作用,因为它不会产生整数。我认为你必须将它向下/向上调整。
答案 2 :(得分:1)
你想要制作这个有多花哨?一个简单的解决方案就是:
SELECT COUNT(*) FROM mytable;
"SELECT id FROM mytable order by id LIMIT 1 OFFSET " + round(rowcount/2)
DELETE FROM mytable WHERE id < ?
如果你走这条路,你应该能够通过键空间删除行的前半部分。如果您只想删除大约一半的行(并且并不关心多少行),您可能会找到一种方法来使用RANDOM()来执行此操作。可能喜欢(警告完全失败):
DELETE FROM mytable WHERE random() < 0.5;