2010-10-17 89 views
1

我有组,每个组都有与之关联的联系人。当用户删除一个组时,如果该组不为空,那么它会提醒他们,如果该组中的所有联系人都继续,将会被删除。无论如何,所以我的问题是设置该功能。从另一个表中删除特定行时删除表中的行

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

在我继续之前,我想知道,但有没有一种通过外键做到这一点的自动化方式?

那么,如果没有它的确定,这是我的查询,但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.*

+0

您正在寻找级联删除可能('上delete') – vittore 2010-10-17 04:16:55

+0

你尝试过'DELETE FROM ...'? – vittore 2010-10-17 04:22:47

+0

CREATE TABLE触点 ( ID SMALLINT UNSIGNED NOT NULL PRIMARY KEY, 描述VARCHAR(40), 外键(GROUP_ID)参考文献基团(ID) ON DELETE CASCADE ON UPDATE CASCADE); – vittore 2010-10-17 04:24:40

回答

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,使用工作台时,请确保相应的数据库/目录在下拉菜单中的对象浏览器选项卡中找到以上选择。您可以指定连接的默认模式/数据库/目录 - 单击工作台启动画面的SQL开发标题下的“管理连接”选项。

+0

我尝试了类似于您的建议,但我的问题在于错误代码1046,没有选择数据库不会消失。不知道该怎么做 – Eli 2010-10-17 04:41:17

+0

@ s2xi:看到我的附加评论 - 你建立了与数据库的连接,但它需要一个模式/数据库/目录上下文。在查询中拥有数据库是不够的。 – 2010-10-17 04:42:56

0

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

+0

我该怎么做? – Eli 2010-10-17 04:19:07

1

你不说出你的RDBMS,但在SQL Server 你可以打开级联删除,我不会建议这样做;这太危险了。

更新:MySQL的InnoDB支持级联删除,以及:FOREIGN KEY Constraints

它是安全的第一手动删除所有引用行,然后删除该组。

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

+0

我使用的InnoDB – Eli 2010-10-17 04:18:43

+0

嗯,好吧,我想我会去手动的方式。毕竟我只需要设置它一次,让PHP为我做重复的工作;-)但是关于我的查询,最新的错误? – Eli 2010-10-17 04:20:13

+0

那么你是否在说使用约束条件将是一条路? – Eli 2010-10-17 04:23:48

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 ; 

注:触发必须是之前删除,否则你可能会失去你想用来删除记录的关键。