簡體   English   中英

Java SQL-刪除數據庫表中的一半行

[英]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值。

你不能 某些數據庫在UPDATEDELETE查詢中不允許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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM