mysql - 按 drive_md5、db_id 清除偏移 > 10 组的行

标签 mysql sql

我正在将数据库转储存储到 MySQL 表中,因此,我打算存储最多 10 个不同转储。第 11 个不同的 转储和以后的转储应该将数据设置为 NULL,以节省空间但保留一些信息可用。

相同 转储具有相同的 drive_md5。

 CREATE TABLE `dumps` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`db_id` int(11) NOT NULL,
`drive_id` char(28) DEFAULT NULL,
`drive_md5` char(32) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`data` longblob,
`filesize` mediumint(8) unsigned DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `drive_md5` (`drive_md5`),
 KEY `db_id` (`db_id`)
) ENGINE=MyISAM AUTO_INCREMENT=43 DEFAULT CHARSET=utf8

如果您需要更多信息,请发表评论,以便我编辑问题。 谢谢

编辑:我接受更清晰标题的建议。

最佳答案

清除除最后10条记录以外的所有数据

UPDATE  dumps
SET     data = null 
WHERE   id NOT IN (SELECT TOP 10 Id from dumps ORDER BY Id DESC )

当您查找每列的最后 10 个时,这不起作用。在本例中为 md5。您可以使用行计数函数实现此目的。为此,您需要一个查询来计算每个 MD5 的行数。示例如下。

SELECT 
id         AS Id_Of_Records_To_Clean,
drive_md5  AS drive_md5_for_Reference
FROM
(
/*Sub query numbering the entries in the dumps table, from 1 to n per drive_m5*/
SELECT TOP 100 PERCENT
ROW_NUMBER() OVER(PARTITION BY drive_md5  ORDER BY drive_md5 , id DESC) AS RowNum,
drive_md5 , Id
ORDER BY drive_md5 , id DESC
) AS RecordsToClearOrDelete
WHERE
RowNum > 10

上面的查询将返回要清理的记录的记录 ID(主键)。然后,您可以使用查询来更新“数据”,其中 ID 在(....上面的查询...)

参见 - ROW OVER with PARTITION for MySQL

希望我已经理解了,希望对您有所帮助。

关于mysql - 按 drive_md5、db_id 清除偏移 > 10 组的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23588709/

相关文章:

sql - PostgreSQL 值 1 和 11 的差异

mysql - 未使用数据库索引导致查询缓慢

mysql - Where 子句中的 SQL 更改条件

mysql - 如何使用 netbeans 管理数据源?

mysql插入记录如果有>有别的

mysql - 如何根据基于另一个表的 case 语句更新表? (在Mysql中)

mysql - MySQL表添加FOREIGN KEY报错150

java - GitHub 文件夹中的 MySQL 数据库

sql - 堆表中页面的输入行与 8060 字节的页面大小不匹配

mysql - 在 MYSQL 中具有多个字段和空格的 LIKE 通配符