Java sql - 删除DB表中的半行

时间:2017-02-09 09:33:38

标签: java sql database sqlite

我想从文件夹中的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值。

3 个答案:

答案 0 :(得分:1)

你做不到。某些数据库不允许在UPDATEDELETE个查询中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;