2014-08-27 50 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聲明中。

相關問題