2017-05-14 71 views
1

我使MySQL數據庫,其中我表中:觸發器邏輯使誤差

  • ID
  • 標題
  • 金額
  • 可用
  • 描述

c OPY表的外鍵film_id

  • ID
  • film_id

而且現在我已經刪除觸發器後拷貝寫着:

UPDATE `film` 
      SET available = available - 1 
WHERE OLD.film_id = id; 

現在我想寫之前刪除觸發器fil米, 由於事實膜是通過複製contrained所以我寫:

DELETE FROM copy WHERE copy.film_id = OLD.id; 

這裏出現錯誤:

無法更新存儲在功能表「電影」 /觸發器,因爲它 已經被調用這個存儲的函數/觸發器的語句使用。

我想刪除影片 - >刪除副本 - >更新膜(ERROR)

+0

如果你刪除一個薄膜(即薄膜表中的行)在第一步,你怎麼可以更新影片reocord(一這是刪除)在第三步?似乎不合邏輯。 –

+0

@DarshanMehta如果我想刪除電影,我必須刪除copy.film_id = OLD.id的所有副本,但它也會觸發電影上的更新並導致問題。 –

回答

2

看起來你並不需要trigger可言。相反,如果film中的父記錄被刪除,您可以配置FOREIGN KEY,以便copy表中的條目將被刪除。看看MySQL的文檔here。您需要使用CASCADE選項:

CASCADE:刪除或從父表中更新該行,並 子表中自動刪除或更新匹配的行。 支持ON DELETE CASCADE和ON UPDATE CASCADE。

這是FOREIGN KEY語法怎麼會是這樣的:

CONSTRAINT fk_film_id FOREIGN KEY (film_id) REFERENCES film(id) ON DELETE CASCADE;