我正在将数据库转储存储到 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/