在另一个表中触发mysql删除?

时间:2014-08-27 10:52:13

标签: sql phpmyadmin sql-delete

我的数据库中有3个表:

|    systems  |
|-------------|
|  system_id  |
|-------------|

|   systems_maintenances  |
|-------------------------|
|  systems_maintenances_id|
|  system_id              |
|  maintenance_id         |
|-------------------------|


|        maintenances     |
|-------------------------|
|  maintenance_id         |
|-------------------------|

当我删除系统时,我希望删除maintenance 目前它只在systems_maintenances表中删除。

我认为触发器是最好的(也是唯一的)方法 我创建了这个:

CREATE TRIGGER `deleteMaintenance` BEFORE DELETE ON `systems`
 FOR EACH ROW BEGIN
  DELETE FROM maintenances
  WHERE maintenance_id = systems_maintenances.maintenance_id;
END

问题是我收到错误:

  

DELETE FROM SNMProjectsystems WHERE systemssystem_id = 16

     

MySQLarépondu:

     

#1054 - 'where子句

中的未知列'systems_maintenances.maintenance_id'

如何解决我的问题?

我不知道它是否可以提供帮助,但我对systems_maintenances表也是如此:

test http://img110.xooimage.com/files/4/6/c/systems_maintenances-4754a0c.png

1 个答案:

答案 0 :(得分:1)

在触发器中,您不会引用受影响的表的表名。相反,你引用它的代理。该proxie取决于数据库。在MySQL中,它是newold

我怀疑你想要这样的东西:

CREATE TRIGGER `deleteMaintenance` BEFORE DELETE ON `systems` FOR EACH ROW BEGIN
          DELETE FROM maintenances m
          WHERE maintenance_id IN (SELECT maintenance_id
                                   FROM systems_maintenances sm
                                   WHERE systems_maintenances.system_id = old.system_id
                                  )
END;

还有其他方法可以表达这种逻辑,但这可以很好地了解结构。

如果您愿意,可以使用级联删除执行基本相同的操作。这样,您就不必编写触发器,并且可以将逻辑放在create table语句中。