例如,我有4个表,都有说userID(可以多次引用。所以例如我可以:
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个表?
答案 0 :(得分: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,则表示您有引用的用户。
答案 1 :(得分:2)
如果您想要阻止删除仍有汽车,车库或工具的用户,您应该将这些表中的外键添加到用户表中。
如果您尝试删除仍然引用的用户,您将收到一个错误,您可以捕获并处理该错误,例如通过向用户显示approriate错误消息。
这有一个额外的好处,即无论人们如何尝试删除用户(SQL命令行,应用程序中的错误代码,......),都将总是被删除。< / p>
答案 2 :(得分: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
答案 3 :(得分: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创建外键。