查找表中的所有行,这些行在同一数据库的任何其他表中都没有引用

时间:2014-07-28 16:32:29

标签: mysql foreign-keys innodb

我使用外键和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;

1 个答案:

答案 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

作为旁注,或许应考虑添加完整性约束?