2010-05-07 79 views
2

我有一個表MRU,它有3列。簡單的DELETE語句不起作用

(VALUE varchar(255); TYPE varchar(20); DT_ADD datetime) 

這是一個簡單地存儲條目並記錄它記錄的日期時間的表格。我想要做的是:每當添加超過特定數字的新條目時,刪除最早的條目。

這裏是我的查詢:

delete from MRU 
where type = 'FILENAME' 
ORDER BY DT_ADD limit 1; 

的錯誤信息是: SQL錯誤:附近的 「序」:語法錯誤...

查詢返回一個錯誤。

+6

它返回只是「一個錯誤」或者「一個特定的錯誤」?你能發佈錯誤信息嗎? – 2010-05-07 19:02:49

+2

爲什麼你有刪除ORDER BY? – Oded 2010-05-07 19:05:08

+1

@Oded - 可以做到這一點。 SQLite語法允許你在DELETE中有一個ORDER BY。它的語義上沒問題。 – 2010-05-07 19:06:09

回答

3

我不是說你應該這樣做,因爲它是完全不可移植的,但如果有迫切需要,這將工作:

在SQLite中,rowid列總是存在,除非在其他地方定義了一個整數主鍵。這可以用於類似的東西:

delete from MRU where rowid = (
    select rowid from MRU order by DT_ADD limit 1 
) 
5

首先,它始終幫助發佈儘可能多的信息。在這個特定的例子中,「錯誤」是無益的,它會花費你2秒鐘的時間來複制和粘貼給出的實際錯誤信息,這將在幫助你時提供有價值的線索。

取而代之,我去了SQLite的DELETE語句的文檔,發現here,並注意到並注意,DELETE沒有ORDER BY,除非它是以特定方式編譯的。我假設你的版本不是,雖然沒有錯誤信息,但很難說。

什麼,你可以嘗試的卻是這樣的:

delete from MRU where DT_ADD = (
    SELECT MIN(DT_ADD) FROM MRU WHERE type = 'FILENAME' 
) 
+1

但請注意,所給出的表格不包含我們可以假定爲主鍵的單個列。 – Dathan 2010-05-07 19:08:58

+0

是的,注意到,我們說話時重寫。 – 2010-05-07 19:10:03

+0

缺乏PK可能是他們爲什麼要使用限制1的原因。這將是更好的只是修復設計和'刪除...在哪裏ID = n' – 2010-05-07 19:19:57