Простое утверждение DELETE не сработало - PullRequest
2 голосов
/ 07 мая 2010

У меня есть таблица MRU, которая имеет 3 столбца.

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

Это таблица, в которой просто хранится запись и записывается дата и время ее записи. Что я хотел сделать: удалить самую старую запись всякий раз, когда я добавляю новую запись, которая превышает определенное число.

Вот мой запрос:

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

Сообщение об ошибке: Ошибка SQL: рядом с «ЗАКАЗАТЬ»: синтаксическая ошибка ...

Запрос возвращает ошибку.

Ответы [ 2 ]

5 голосов
/ 07 мая 2010

Прежде всего, это всегда помогает опубликовать столько информации, сколько у вас есть. В данном конкретном случае «ошибка» бесполезна, и вам потребовалось бы, возможно, 2 секунды, чтобы скопировать и вставить данное сообщение об ошибке, что даст нам ценные подсказки, помогая вам.

Вместо этого я перешел к документации для оператора DELETE SQLite, обнаружил здесь и заметил, что вот, DELETE не имеет ORDER BY, если он не скомпилирован определенным образом. Я предполагаю, что ваша версия не так, хотя без сообщения об ошибке это трудно сказать.

Вместо этого вы можете попробовать:

delete from MRU where DT_ADD = (
    SELECT MIN(DT_ADD) FROM MRU WHERE type = 'FILENAME'
)
3 голосов
/ 08 мая 2010

Я не говорю, что вы должны это делать, поскольку он полностью не переносим, ​​но если есть настоятельная необходимость, это будет работать:

В SQLite столбец rowid всегда существует, если в другом месте не указан целочисленный первичный ключ. Это может быть использовано во что-то вроде:

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