0

例如,我有 4 个表,都带有用户 ID(可以多次引用。所以例如我可以有:

Cars
id, ..., userID  // userID = owner of the car

Garages
id, ..., userID // userID = owner of the garage

Tools
id, ..., userID // userID = owner of the tool

现在我想做一个查询来删除用户,但我只想在他们所有相关数据都消失的情况下删除用户。换句话说,我想确保没有引用数据(假设我不允许 userID = -1 或 null。它必须分配给用户

我能看到进行检查的唯一方法是:

SELECT count(*) FROM Cars WHERE USERID = userID
SELECT count(*) FROM Garages WHERE USERID = userID
SELECT count(*) FROM Tools WHERE USERID = userID

我必须检查是否有任何结果大于 0。有没有办法在一个 SQL SELECT 查询中跨 N 个表进行检查?

4

4 回答 4

2

您可以将计数相加,如下所示:

SELECT (SELECT count(*) FROM Cars WHERE USERID = userID)
     + (SELECT count(*) FROM Garages WHERE USERID = userID)
     + (SELECT count(*) FROM Tools WHERE USERID = userID)
FROM ...

如果结果为非 0,则您有一个引用的用户。

于 2013-01-21T08:48:25.540 回答
2

如果您想防止删除仍有汽车、车库或工具的用户,您应该将这些表中的外键添加到用户表中。

如果您随后尝试删除仍被引用的用户,您将收到一个可以捕获并处理的错误,例如通过向用户显示适当的错误消息。

这有一个额外的好处,即无论某人如何尝试删除用户(SQL 命令行,应用程序中的一段错误代码,......),删除都将始终被阻止

于 2013-01-21T08:59:36.097 回答
1
SELECT  (SELECT count(*) FROM Cars WHERE USERID = userID) as CarCount
,       (SELECT count(*) FROM Garages WHERE USERID = userID) as GarageCount
,       (SELECT count(*) FROM Tools WHERE USERID = userID) as ToolCount
于 2013-01-21T08:47:49.073 回答
0

如果 Cars 是您要更改的主表,您也可以试试这个:

SELECT count(*)
FROM   Cars 
       INNER JOIN
       Garages 
       ON Cars.USERID = Garages.USERID, 
       INNER JOIN
       Tools
       ON Cars.USERID= Tools.USERID
WHERE  Cars.USERID = SOME_USER_ID;

建议为 USERID 创建一个外键。

于 2013-01-21T09:33:32.007 回答