【问题标题】:Java sql - delete half rows in DB tableJava sql - 删除数据库表中的半行
【发布时间】:2017-06-27 05:45:46
【问题描述】:

我想从文件夹中的数据库文件中删除一堆行。连接并计算 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 表,但我想要删除一半的 db 行,如我所做的 rowcount/2 所示。

更新:

到目前为止,我已经通过找到位于 n-rows/2 的 id 然后获取它的值(例如 264352)解决了这个问题。然后使用该数字指示将要删除哪些 id 行(例如 id.value

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 值都将被删除。

【问题讨论】:

  • 怎么样:delete from wifi_probe_requests where primary_key_column in (select primary_key_column from wifi_probe_requests limit ...)?
  • 是的,我尝试了类似于建议的方法,它似乎工作得很好。有点奇怪,您需要额外的步骤,但至少它有效。

标签: java sql database sqlite


【解决方案1】:

你不能。某些数据库不允许在UPDATEDELETE 查询中使用LIMIT

似乎使用 SQLite 可以通过compiling your own version 解决此问题,但如果您不愿意这样做,则需要以不同的方式重写您的查询。例如,如果您在表中有一个自动增量 id,您可以计算“中间”id 并使用WHERE id &lt; [middle id] 作为LIMIT 的替代品。

【讨论】:

  • 天啊,太糟糕了。我尝试了您的建议,它奏效了,非常感谢您的帮助:) sql ="SELECT id FROM wifi_probe_requests LIMIT "+ rowcount/2 + ",1";给我该行的 ID,然后将其保存到一个变量中,然后使用: sql = "DELETE FROM wifi_probe_requests WHERE id
  • 太棒了。有很多不同的方法可以解决它,这是第一个想到的。假设 id 是带有索引的主键,应该很快。您对中间 id 的初始查询应包含 ORDER BY 以确保您获得正确的 id。
【解决方案2】:

正如@Kayaman 所说,使用 SQLITE 是不可能的。 您可以通过以下查询绕过它;

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

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

【讨论】:

  • 是的,我尝试了@Kayaman 的建议并且成功了: sql ="SELECT id FROM wifi_probe_requests LIMIT "+ rowcount/2 + ",1";给我该行的 ID,然后将其保存到一个变量中,然后使用: sql = "DELETE FROM wifi_probe_requests WHERE id
【解决方案3】:

你想把这个做多花哨?一个简单的解决方案是这样的:

SELECT COUNT(*) FROM mytable;
"SELECT id FROM mytable order by id LIMIT 1 OFFSET " + round(rowcount/2)
DELETE FROM mytable WHERE id < ?

如果你走那条路,你应该能够通过键空间删除前半行。如果您只想删除大约一半的行(并且不在乎有多少),您可能会找到一种使用 RANDOM() 来执行此操作的方法。可能像(WARNING TOTALLY UNTESTED):

DELETE FROM mytable WHERE random() < 0.5;

【讨论】:

  • 目前有这个似乎工作: sql = "SELECT COUNT(*) AS id FROM wifi_probe_requests";然后 sql = "DELETE FROM wifi_probe_requests WHERE id
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2015-04-08
  • 1970-01-01
  • 2020-09-23
相关资源
最近更新 更多