2013-07-04 3 views
0

В настоящее время я запускаю триггеры в своей db-структуре. У меня есть таблицы - назовем их родителями и дочерними. Триггер вызывается после вставки в таблицу cild. Вставка-Заявление являетсяСчетчик MySQL Trigger Update parent_table, используемый INSERT IGNORE INTO SELECT

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

Заявление в триггере после-вставки таблицы ребенка является:

UPDATE parent SET derivate_count = derivate_count + 1; 

Родительская таблица не имеет триггер на обновление или что-то еще, и я получаю ошибку : SQL Fehler (1442): не удается обновить «родительский» таблицы в хранимой функции/триггере, потому что он уже используется оператором, который вызывал эту хранимую функцию/триггер.

Я бы понял, возникла бы эта ошибка, если бы я заставил одно и то же событие на родительском столе - как это можно решить?

С наилучшими пожеланиями,

Dominik

+0

Не ответ, но вы подсчитываете, сколько детей имеет родитель? Поскольку это так, у ребенка есть parent_id, поэтому с правильным индексом было бы молниеносно просто сделать счет на объединение двух таблиц вместо использования триггера. – Nanne

+0

У меня есть почти 500 тыс. Строк в родительской таблице, и 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 проверьте, существует ли запись ... посмотрите на пример ... я даже поместил пример кода для удаления и вставки. –

Смежные вопросы