清除偏移行的行> 10分组由drive_md5,db_id组成

时间:2014-05-11 03:53: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

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

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

2 个答案:

答案 0 :(得分:1)

清除所有例外情况中的最后一条记录

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(PRIMARY KEY)。然后,您可以使用查询来更新“数据”,其中ID位于(....查询上方...)

请参阅 - ROW OVER with PARTITION for MySQL

希望我明白并希望得到这个帮助。

答案 1 :(得分:0)

正如评论中所指出的,实现这一目标的最佳方法是在插入之前,而不是之后。 因此,我在数据中运行md5算法并检查数据库,其中md5 = md5,数据为非null且db = db。因此,如果记录WITH数据和相同的db / md5,则无需提供数据列。

现在,我只需要一个清理查询,它应该在数据不为空的第10行之后清空DATA。