Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLite数据库中只保留N条最后记录,按日期排序_Sql_Sqlite_Sql Delete - Fatal编程技术网

在SQLite数据库中只保留N条最后记录,按日期排序

在SQLite数据库中只保留N条最后记录,按日期排序,sql,sqlite,sql-delete,Sql,Sqlite,Sql Delete,我有一个SQLite数据库,我需要执行以下操作:只保留最后N条记录,按日期排序。怎么做?删除除最近10条记录外的所有记录 delete from test where id not in ( select id from test order by date desc limit 10 ) 根据报告: 如果使用SQLite\u ENABLE\u UPDATE\u DELETE\u LIMIT编译时选项编译SQLite,则通过添加可选的ORDER by和LIMIT

我有一个SQLite数据库,我需要执行以下操作:只保留最后N条记录,按日期排序。怎么做?

删除除最近10条记录外的所有记录

delete
from test
where id not in (
    select id
    from test
    order by date desc
    limit 10
)
根据报告:

如果使用SQLite\u ENABLE\u UPDATE\u DELETE\u LIMIT编译时选项编译SQLite,则通过添加可选的ORDER by和LIMIT子句来扩展DELETE语句的语法

如果DELETE语句有ORDERBY子句,则在没有LIMIT子句的情况下将删除的所有行都将根据ORDERBY进行排序。跳过前M行,其中M是通过计算OFFSET子句表达式找到的值,删除以下N行,其中N是LIMIT表达式的值。如果在考虑OFFSET子句后,剩余的行数少于N行,或者如果LIMIT子句的计算结果为负值,则删除所有剩余行

这将允许您编写:

DELETE FROM table WHERE expr ORDER BY date DESC LIMIT -1 OFFSET 10

要只保留最后10条记录,请考虑倒排

要删除旧的10条记录,请执行以下操作:

DELETE FROM Table_name 
WHERE date in (SELECT date FROM Table_name ORDER BY Date Desc Limit -1 
               OFFSET  (select count(*)-10 from Table_name) );
让我知道它是如何为你工作的

假设您有一个id列,它是一个自动递增的序列号,您可以使用以下命令:

DELETE FROM table_name
WHERE id < (
    SELECT MIN(id)
    FROM (SELECT id
          FROM table_name
          ORDER BY id DESC
          LIMIT num_of_records_to_keep))

使用时间戳列时可以使用相同的查询,只需将id替换为时间戳列

需要这些列,如果有,则自动递增…重复:谢谢。但是我怎么知道我需要删除多少条记录呢?你不知道,这个查询只删除了最近的10条记录。谢谢,它成功了。虽然您的sql语句不需要*不是吗…order by date desc limit 10?我尝试了这个精确的查询剪切粘贴,但返回了一个错误。然后,我尝试按照@Drejc的建议,将desc放在order by date之后,如果剩余的行数少于N行,它就起作用了。这里-1是什么意思?@IgorGanapolsky看引用段落的最后一句话:如果LIMIT子句的值为负值,则删除所有剩余的行。因此,如果表中总共少于10行,则所有行都将被删除?@IgorGanapolsky如果表中总共少于10行,那么它们都不会被删除。@VladimirCh可能是因为这个问题是针对SQLite的,而不是针对mariaDB的。