2010-05-07 93 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