Java sql-删除数据库表中的半行

Java sql-删除数据库表中的半行,java,sql,database,sqlite,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.execut

我想从文件夹中的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)
不使用限制可以很好地工作,我可以删除整个db表,但我想要的是删除我制作的rowcount/2所显示的一半db行

更新:

到目前为止,我已经解决了这个问题,找到了位于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值都将被删除。

您不能。某些数据库不允许限制更新或删除查询


使用SQLite似乎可以解决这个问题,但是如果您不愿意这样做,您需要以不同的方式重写查询。例如,如果表中有一个自动递增id,则可以计算中间id,并使用WHERE id<[middle id]作为限制的替代方法。

您不能。某些数据库不允许限制更新或删除查询


使用SQLite似乎可以解决这个问题,但是如果您不愿意这样做,您需要以不同的方式重写查询。例如,如果表中有一个自动增量id,则可以计算中间id,并使用WHERE id<[middle id]作为限制的替代方法。

如@Kayaman所述,使用SQLITE是不可能的。 您可以通过以下查询绕过此问题:

DELETE FROM wifi_probe_requests WHERE id IN (SELECT id FROM wifi_probe_requests LIMIT 10)

还有一件事;我认为rowcount/2在行数不均匀时不起作用,因为它不会生成整数。我认为您必须将其向下/向上取整。

正如@Kayaman所述,使用SQLITE是不可能的。 您可以通过以下查询绕过此问题:

DELETE FROM wifi_probe_requests WHERE id IN (SELECT id FROM wifi_probe_requests LIMIT 10)

还有一件事;我认为rowcount/2在行数不均匀时不起作用,因为它不会生成整数。我想你得把它四舍五入。

你想做什么?一个简单的解决方案是:

SELECT COUNT(*) FROM mytable;
"SELECT id FROM mytable order by id LIMIT 1 OFFSET " + round(rowcount/2)
DELETE FROM mytable WHERE id < ?
如果您这样做,您应该能够通过键空间删除前半行。如果您只想删除大约一半的行,而不关心有多少行,那么您可能会找到一种使用RANDOM的方法来完成这项工作。可能像完全未经测试的警告:


你想做什么?一个简单的解决方案是:

SELECT COUNT(*) FROM mytable;
"SELECT id FROM mytable order by id LIMIT 1 OFFSET " + round(rowcount/2)
DELETE FROM mytable WHERE id < ?
如果您这样做,您应该能够通过键空间删除前半行。如果您只想删除大约一半的行,而不关心有多少行,那么您可能会找到一种使用RANDOM的方法来完成这项工作。可能像完全未经测试的警告:


关于:从wifi_probe_请求中删除,其中从wifi_probe_请求限制中选择primary_key_列的primary_key_列中删除primary_key_列…?是的,我尝试了类似于建议的方法,似乎效果很好。只是有点奇怪,你需要额外的步骤,但至少它是有效的。关于:从wifi_探测_请求中删除,从wifi_探测_请求中选择primary_key_列中的primary_key_列中删除primary_key_列…?是的,我尝试了类似于建议的方法,似乎效果很好。有点奇怪,你需要额外的步骤,但至少它是有效的。是的,我尝试了@Kayaman的建议,结果成功了:sql=SELECT id FROM wifi\u probe\u requests LIMIT+rowcount/2+,1;为我获取该行的ID,然后将其保存到一个变量中,然后使用:sql=DELETE FROM wifi_probe_requests,其中ID<+rownumber;是的,我尝试了@Kayaman的建议,效果很好:sql=selectid fromwifi\u probe\u requests LIMIT+rowcount/2+,1;为我获取该行的ID,然后将其保存到一个变量中,然后使用:sql=DELETE FROM wifi_probe_requests,其中ID<+rownumber;删除有效的。哦,伙计,那太糟糕了。我尝试了你的建议,效果很好,谢谢你的帮助:sql=从wifi选择id\u probe\u请求限制+行数/2+,1;为我获取该行的ID,然后将其保存到一个变量中,然后使用:sql=DELETE FROM wifi_probe_requests,其中ID<+rownumber;删除有效的。太好了。有很多不同的方法可以解决这个问题,这是第一个出现在脑海中的方法。假设id是带索引的主键,则应该很快。您对中间id的初始查询应该包括ORDER BY,以确保您获得了正确的id。噢,伙计,这太糟糕了。我尝试了你的建议,效果很好,谢谢你的帮助:sql=从wifi选择id\u probe\u请求限制+行数/2+,1;为我获取该行的ID,然后将其保存到一个变量中,然后使用:sql=DELETE FROM wifi_probe_requests,其中ID<+rownumber;删除有效的。太好了。有很多不同的方法可以解决这个问题,这是第一个出现在脑海中的方法。应该是
快速假设id是带有索引的主键。您对中间id的初始查询应包括ORDER BY,以确保您获得正确的id。目前,这似乎可行:sql=选择COUNT*作为wifi\u probe\u请求的id;然后sql=从wifi_probe_请求中删除,其中id<按id ASC LIMIT+行数/2+从wifi_probe_请求中选择id,1;第一个用于行计数,第二个用于删除行。是的,这只是前半行或最多n行,如果是这样的话,因为最新的行(未删除的行)将被使用,然后被删除。目前,这似乎是可行的:sql=选择计数*作为wifi探测请求的id;然后sql=从wifi_probe_请求中删除,其中id<按id ASC LIMIT+行数/2+从wifi_probe_请求中选择id,1;第一个用于行计数,第二个用于删除行。是的,这只是前半行,如果是这样的话,最多是n行,因为最新的行,即那些没有被删除的行,将被使用,然后被删除。