2017-01-01 40 views
0

我正在運行一個更新語句,它在sqlite中工作得很好,但jdbc失敗。SQLITE - 'ORDER'附近的JDBC錯誤

命令:

UPDATE BKPSERVER set BKP_STATUS = 'S' 
where CLIENT_IP = '192.168.0.16' AND BKP_STATUS='R' 
ORDER BY ROWID DESC 
LIMIT 1; 

但使用JDBC失敗與下面的語句。

enter coException in thread "main" org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (near "ORDER": syntax error) 

請告訴我能做些什麼來解決這個問題,因爲它根本沒有意義。

回答

4

如果你看一下語法圖的SQLite's UPDATE

enter image description here

你應該注意到有一個ORDER BY子句中沒有提及。在UPDATE中包含ORDER BY確實沒什麼意義:您正在更新記錄的集合,因此沒有什麼可以排序的,對於LIMIT子句也是如此。你應該說:

UPDATE BKPSERVER set BKP_STATUS = 'S' where CLIENT_IP = '192.168.0.16' AND BKP_STATUS='R'; 

如果有與CLIENT_IPBKP_STATUS多條記錄,那麼你就必須找到一個獨特的一些其他的方式,也許是一個子查詢:

UPDATE BKPSERVER 
set BKP_STATUS = 'S' 
where rowid = (
    select rowid 
    from BKPSERVER 
    where CLIENT_IP = '192.168.0.16' 
     AND BKP_STATUS='R' 
    ORDER BY ROWID DESC 
    LIMIT 1 
); 

一些版本的SQLite是使用SQLITE_ENABLE_UPDATE_DELETE_LIMIT標誌設置的,因此UPDATE確實支持ORDER BYLIMIT;對於那些SQLite的建立,UPDATE樣子:

enter image description here

但似乎你的SQLite是不是跟這個標誌啓用建成。

+0

這工作完美...許多感謝:-) – gcclinux

0

也許這樣的事?

UPDATE BKPSERVER 
set BKP_STATUS = 'S' 
where CLIENT_IP = '192.168.0.16' 
    AND BKP_STATUS='R' 
    AND ROWID = ( SELECT MAX(ROWID) 
        FROM BKPSERVER b2 
        where b2.CLIENT_IP = '192.168.0.16' 
         AND b2.BKP_STATUS='R') 
+0

上面的很好的建議,但還沒有工作,我會繼續在這工作 – gcclinux

+1

@gcclinux我看不出任何理由爲什麼這不起作用。你得到了什麼錯誤信息或不正確的行爲? –