2017-02-09 48 views
0

我想從文件夾中的一個DB文件中刪除一堆行。連接並計數db文件中的行數,但當我嘗試刪除特定數量的行時,我卡住了。Java sql - 刪除數據庫表中的半行

輸入:

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。

UPDATE:

到目前爲止,我已經通過(264352例)發現,其位於正行/ 2的ID,然後得到它的價值解決了這個問題。然後使用該數字來指示將刪除哪些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值都將被刪除。

+0

http://stackoverflow.com/questions/1824490/how-do-you-enable-limit-for-delete-in-sqlite – p0rter

+0

什麼:'從wifi_probe_requests中刪除primary_key_column in(從wifi_probe_requests限制中選擇primary_key_column ...)'? –

+0

是的,我嘗試了類似的建議,似乎工作得很好。只是有點奇怪,你需要額外的步驟,但至少它的作品。 – TarikM

回答

1

你不能。某些數據庫不允許在UPDATEDELETE查詢中使用LIMIT

似乎用SQLite可以解決這個問題,由compiling your own version,但如果你不願意這樣做,你需要以不同的方式重寫你的查詢。例如,如果表中有一個自動增量ID,則可以計算「中間」ID並使用WHERE id < [middle id]作爲LIMIT的替代方法。

+0

唉,那太糟糕了。我試過你的建議,它的工作,所以謝謝你的幫助:) SQL =「SELECT ID FROM wifi_probe_requests LIMIT」+ rowcount/2 +「,1」;找到該行的ID,然後將其保存到變量中,然後使用:sql =「DELETE FROM wifi_probe_requests WHERE id <」+ rownumber;刪除哪些工作。 – TarikM

+0

太好了。有很多不同的方法可以解決這個問題,這是首先想到的。應該快速假設id是一個包含索引的主鍵。你最初的中間ID查詢應該包括一個'ORDER BY'來確保你得到了正確的ID。 – Kayaman

+0

新增,感謝您的幫助。 – TarikM

1

正如@Kayaman所述,這是不可能使用SQLITE的。 你可以繞過這個查詢,如;

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

還有一件事;我不認爲(rowcount/2)在行數不均時會起作用,因爲它不會產生整數。我想你將不得不把它整理下來。

+0

是的,我試了@Kayaman的建議,它的工作原理:sql =「SELECT ID FROM wifi_probe_requests LIMIT」+ rowcount/2 +「,1」;找到該行的ID,然後將其保存到變量中,然後使用:sql =「DELETE FROM wifi_probe_requests WHERE id <」+ rownumber;刪除哪些工作。 – TarikM

1

你想要做出這樣的想法嗎?一個簡單的解決方案就像這樣:

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

如果你走這條路線,你應該能夠通過keyspace刪除前半部分的行。如果你只想刪除大約一半的行(並且不關心多少),你可能會找到一種方法來使用RANDOM()來完成這個任務。也許像(警告沒有經過測試的):

DELETE FROM mytable WHERE random() < 0.5; 
+1

目前有這似乎工作:sql =「SELECT COUNT(*)AS id FROM wifi_probe_requests」;然後sql =「DELETE FROM wifi_probe_requests WHERE id <(SELECT ID FROM wifi_probe_requests ORDER BY id ASC LIMIT」+ rowcount/2 +「,1)」;第一個用於行數,第二個用於刪除行。是的,它只是前半部分(或者如果是這樣的話,最多爲n個),因爲最近的行(未被刪除的行)將被使用(然後被刪除)。 – TarikM

+0

是的,這將工作:-) –