【问题标题】:Delete recored constrain using Inner join for 3 tables in MySql在 MySql 中使用内连接删除 3 个表的记录约束
【发布时间】:2013-09-20 09:57:12
【问题描述】:

我正在寻找连接查询。其实我有主要的三个表。

- Category [cat_id(PK), cat_name]
- Product  [pro_id(PK), cat_id(FK),pro_name]
- Company  [com_id(PK), cat_id(FK),pro_id(FK),...]

现在我在列表视图中有类别列表。所以当用户点击删除选择的类别应该被删除。

现在我可以检查单个表是否相同的cat_id 被其他两个表使用?

if(check cat_id is used in other tables or not)  
{
alert("you can't delete because category is used by some other table(s).");
}
else
{
alert("record deleted.");
}

现在我可以使用NOT INlike 从单个表中检查相同的内容,

DELETE FROM CATEGORY WHERE cat_id NOT IN (SELECT DISTINCT cat_id FROM PRODUCT);

这只会删除选定的 cat_id,如果它在 PRODUCT 表中不可用。

即使我尝试过JOIN QUERY也如下,

SELECT CATEGORY.cat_id FROM CATEGORY INNER JOIN PRODUCT ON CATEGORY.cat_id =  PRODUCT.cat_id;

但我不知道如何使用第三张表。所以,我想知道如何检查多个表。

请帮助解决这个问题。

【问题讨论】:

  • 带有join 条件
  • CASCADE DELETE你试过了吗?
  • 如果您设置了参照完整性,您可以简单地尝试。 DBMS 将阻止您删除已使用的行。如果您想在所有条件下放弃它,请尝试 dianuj 提到的 CASCADE。
  • stackoverflow.com/questions/2914936/… @dianuj 是这样的吗? & 就像我有 cat_id=5 并且它被 pro_id=2 使用那么它将删除 pro_id=2 以及 cat_id=5 是这样吗?
  • @dianuj 感谢您的 cmets,但它不应该没问题。下面的答案对我来说非常有用。再次感谢

标签: mysql constraints inner-join


【解决方案1】:
DELETE FROM CATEGORY WHERE cat_id NOT IN 
(SELECT DISTINCT cat_id FROM PRODUCT) AND cat_id NOT IN
(SELECT DISTINCT cat_id FROM COMPANY)

【讨论】:

  • 看起来上面的查询会删除类别表中的每一行,除了其他表中不存在的行。
【解决方案2】:

如果你想在一个查询中进行删除和检查,你可以使用

DELETE
FROM category
WHERE category.cat_id = ? 
    AND (SELECT COUNT(*) FROM product WHERE cat_id = ?) = 0 
    AND (SELECT COUNT(*) FROM company WHERE cat_id = ?) = 0

如果您只是想检查是否有与该键匹配的行,您可以运行

SELECT (SELECT COUNT(*) FROM product WHERE cat_id = ?) 
    AND (SELECT COUNT(*) FROM company WHERE cat_id = ?) AS matching_rows

【讨论】:

  • 毫无疑问地接受了。感谢您的回答。它完美的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多