我将数据库转储存储到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
如果您需要更多信息,请发表评论,以便我可以编辑问题。 感谢
编辑:我接受了一个更清晰的标题建议。
答案 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。