2013-07-04 108 views
0

我正在開始在我的db結構中使用觸發器。 我必須把桌子稱爲父母和孩子。 觸發器在插入到cild表後調用。 位刀片式語句MySQL觸發更新INSERT IGNORE INTO SELECT使用的parent_table的計數器

INSERT IGNORE INTO child (parent_id) 
SELECT 
    id 
FROM parent 
WHERE somecondition = 1 

在後INSERT觸發器子表的語句是:

UPDATE parent SET derivate_count = derivate_count + 1; 

父表上更新或別的東西沒有觸發,我收到了錯誤: SQL Fehler(1442):無法更新存儲的函數/觸發器中的表'父',因爲它已被調用此存儲函數/觸發器的語句使用。

我會明白,如果我強制在父表上的相同事件會發生此錯誤 - 這怎麼能解決?

親切的問候,

多米尼克

+0

不是一個答案,但你指望父母有多少個孩子?因爲是這樣的,孩子有一個parent_id,所以有了正確的索引,只需要計算兩個表的連接而不是使用觸發器就可以快速閃爍。 – Nanne

+0

我在父表中有近500k行,並且derivate_count是經常需要的...在每次調用時計算它,我需要它減慢查詢下來就像地獄:) –

+0

它不應該。如果你有一個索引,它會花費大約「log(n)」檢查(這有點超過5)。應該幾乎沒有時間。你真的應該試着解決這個問題,而不是用觸發器去做! – Nanne

回答

0

使用OLD.fieldName和NEW.fieldName之前分別在更新後參考值...

delimiter | 

CREATE TRIGGER testref AFTER UPDATE ON parent 
    FOR EACH ROW BEGIN 
    declare count_ integer; 
    select count(*) into count_ from child where parent_id = NEW.id; 
    if (if count_ = 0) 
     then 
      INSERT INTO child (parent_id) values (NEW.id); 
      delete from child where parent_id = OLD.id; 
      ... more code ... 
     else 
      ... more code .... 
      ... else is optional, but an end to end the if is not.... 
     end if; 
    END; 
| 

delimiter ; 
+0

hm - 我的問題是,我不知道該條目是否已經存在於子表中...並且父母的計數器應該更新,如果孩子插入成功 –

+0

@DominikHabichtsberg然後使用if檢查條目是否已經存在...看看例子...我甚至把刪除和插入的示例代碼。 –