我使用外键和InnoDB。 我有一个图像表,其中包含所有上传的图像数据。 每次我删除与图像表的连接时,我通常会将图像表中的特定行标记为已删除。因此垃圾收集器通常会删除未使用的图像。
一次不超过1个连接使用任何图像。
出于优化目的,我想找到图像表中没有连接的所有行(列" Id")。因为任何未使用的行都是僵尸行。
从我们失败的测试中,仍有一些没有连接的行。
示例图像表:
CREATE TABLE `image` (
`Id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`FileName` varchar(255) NOT NULL,
`Is_Deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',
`Disabled` tinyint(1) unsigned DEFAULT '0',
PRIMARY KEY (`Id`),
) ENGINE=InnoDB AUTO_INCREMENT=816 DEFAULT CHARSET=utf8;
答案 0 :(得分:1)
您可以使用此查询列出所有“僵尸”行:
SELECT
*
FROM
image
WHERE
image.`Id` NOT IN (SELECT table1.IdFK FROM table1 UNION
SELECT table2.IdFK FROM table2 UNION
SELECT table3.IdFK FROM table3 ... )
基本上它检查image.Id是否作为另一个表中的FK存在。您可以添加所需数量UNION
。
作为旁注,或许应考虑添加完整性约束?