2014-08-27 84 views
0

我在我的数据库3个表:在另一个表中触发mysql删除?

| 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 SNMProject . systems WHERE systems . system_id =16

MySQL a répondu:

#1054 - Unknown column 'systems_maintenances.maintenance_id' in 'where clause

如何解决我的问题?

我不知道这是否可以帮助,但我这也为systems_maintenances表:

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

+0

触发器不是解决方案,DELETE CASCADE是其中之一。请参阅http://www.mysqltutorial.org/mysql-on-delete-cascade/ – 2014-08-27 10:55:41

回答

1

在扳机,你没有提到的表表名受到影响。相反,你指的是它的代理。该代理取决于数据库。在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声明中。

相关问题