[英]Java sql - delete half rows in DB table
我想從文件夾中的數據庫文件中刪除一堆行。 連接並計算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值。
你不能 某些數據庫在UPDATE
或DELETE
查詢中不允許LIMIT
。
似乎使用SQLite可以解決此問題,方法是編譯自己的版本 ,但是如果您不願意這樣做,則需要以其他方式重寫查詢。 例如,如果表中有一個自動增量ID,則可以計算“中間” ID,並使用WHERE id < [middle id]
來替代LIMIT
。
如@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()進行此操作的方法。 可能像( 警告未完全測試 ):
DELETE FROM mytable WHERE random() < 0.5;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.