删除另一个表中的特定行时从表中删除行

时间:2010-10-17 04:11:48

标签: sql mysql mysql-error-1046

我有群组,每个群组都有与之关联的联系人。当用户删除某个组时,如果该组不为空,则会提醒他们如果该组中的所有联系人继续,则将删除该组中的所有联系人。好吧无论如何,所以我的问题是设置这个功能。

我试图找出如何删除属于该群组的所有联系人并删除该群组。

在我继续之前,我想知道但是有没有一种通过外键实现这一目的的自动化方式?

好吧,如果不是它的确定,这是我的查询,但SQL Workbench抛出以下错误

DELETE c
FROM `list_`.`contacts` AS c
INNER JOIN `list_`.`groups` AS g ON c.group_id = g.id
WHERE g.group = 'School' 
  AND c.user_id = 2;

错误:

Error Code: 1046 No database selected

在这里真的很困惑,我也试过c.*

4 个答案:

答案 0 :(得分:2)

单个语句中的

MySQL supports multi-table deletions - 使用:

DELETE c, g
  FROM `list_`.`contacts` AS c
  JOIN `list_`.`groups` AS g ON c.group_id = g.id
                            AND g.group = 'School' 
 WHERE c.user_id = 2;

关于错误代码1046,使用WorkBench时,请确保在“对象浏览器”选项卡上方的下拉菜单中选择了相应的数据库/目录。您可以为连接指定默认架构/数据库/目录 - 单击Workbench初始屏幕的SQL Development标题下的“管理连接”选项。

答案 1 :(得分:1)

您没有说明您的RDBMS,但在SQL Server 中您可以启用级联删除,我不建议这样做;这太危险了。

更新:MySQL InnoDB也支持级联删除:FOREIGN KEY Constraints

首先手动删除所有引用行,然后删除该组更安全。

错误消息“Error Code: 1046 No database selected”表明它不是您的TSQL错误。你指的是一个数据库吗?

答案 2 :(得分:1)

在Mysql中你可以尝试这样的触发器:

DELIMITER $$
DROP TRIGGER IF EXISTS `deluser`$$

CREATE TRIGGER `deluser` BEFORE DELETE on `biguser`
FOR EACH ROW
BEGIN
DELETE FROM smalluser WHERE id=OLD.id;
END$$

DELIMITER ;

注意:触发器必须在删除之前,否则您可能会丢失要用于删除记录的密钥。

答案 3 :(得分:0)

我认为你可以用触发器做到这一点。