【问题标题】:delete rows from a table when a specific row from another table has been deleted当另一个表中的特定行已被删除时,从表中删除行
【发布时间】:2011-04-26 12:06:12
【问题描述】:

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

我试图弄清楚如何删除属于该组的所有联系人并同时删除该组。

在我继续之前,我想知道是否有一种通过外键自动执行此操作的方法?

如果不正常,这是我的查询,但 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.*

【问题讨论】:

  • 您可能正在寻找级联删除(on delete
  • 你试过DELETE FROM ...吗?
  • CREATE TABLE 联系人(ID SMALLINT UNSIGNED NOT NULL PRIMARY KEY,描述 VARCHAR(40),外键 (group_id) REFERENCES groups (id) ON DELETE CASCADE ON UPDATE CASCADE);
  • 那么当我从联系人表中删除一行时会发生什么?

标签: sql mysql mysql-error-1046


【解决方案1】:

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 标题下的“Manage Connections”选项。

【讨论】:

  • 我尝试了与您的建议类似的方法,但我的问题是错误代码 1046,未选择数据库不会消失。不知道该怎么办
  • @s2xi:请参阅我的附加评论 - 您已连接到数据库,但它需要架构/数据库/目录上下文。在查询中包含数据库是不够的。
【解决方案2】:

在 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】:

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

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

    先手动删除所有引用行,再删除组比较安全。

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

    【讨论】:

    • 嗯,好吧,我想我会采用手动方式。毕竟我只需要设置一次,让 PHP 为我做重复的工作 ;-) 但是关于我的查询,有什么问题?
    • 那么您是说使用约束是可行的方法吗?
    • 这就是问题所在,我的数据库是 list_,它包含在我的查询中。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      相关资源
      最近更新 更多