Задавайте вопросы, мы ответим
Вы не зашли.
ситуация такова:
Имеется 3 таблицы: "test" - таблица тестов, "question" - таблица вопросов, "test_question" - связующая таблица. И триггеры с ними связанные.
Проблема возникает при удалении записи из таблицы test.
CREATE TABLE test (
`id_test` int(10) unsigned NOT NULL auto_increment,
`test_level` enum('easy','normal','hard) NOT NULL,
`short_info` tinytext NOT NULL
PRIMARY KEY (`id_test`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2 ;
DROP TRIGGER IF EXISTS test_tr
CREATE TRIGGER test_tr BEFORE DELETE ON test
FOR EACH ROW DELETE question FROM question a, test_question b WHERE b.id_test = old.id_test AND a.id_question = b.id_question;
CREATE TABLE question (
`id_question` int(10) unsigned NOT NULL auto_increment,
`text` tinytext NOT NULL,
`point` int(10) NOT NULL
PRIMARY KEY (`id_question`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2 ;
DROP TRIGGER IF EXISTS quest_tr
CREATE TRIGGER quest_tr BEFORE DELETE ON question
FOR EACH ROW DELETE FROM test_question b WHERE b.id_question = old.id_question;
CREATE TABLE test_question (
`id_test` int(10) unsigned NOT NULL,
`id_question` int(10) unsigned NOT NULL,
UNIQUE KEY `place_sport` (`id_test`,`id_question`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;
т.е. вместе с тестом (из табл test) должны удалятся и все вопровы (из табл question), которые в него входят . С другой стороны, при удалении какого-либо вопроса (из табл test) должна удалятся связь теста с удаленным вопросом (из табл test_question). И тот и другой триггер нужны для поддержания целостности БД, но при их взаимном существовании возникает ошибка #1442 - Can't update table 'event_sport' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Как я понял проблема в следующем: триггер (quest_tr) пытается обновить таблицу (test_question), которая заблокирована выражением (/триггером test_tr), которое и вызвало этот триггер.
Есть ли пути решения данной проблемы???
Неактивен
Все намного проще - оставь только один триггер который реально что то удаляет, а при попытке удаления из второй таблицы просто выдавай запрет. В своем интерфейсе (например PHP программе, дай возможность удалять только из первой таблицы.)
Вот у меня аналогичная ситуация - дерево каталогов, и мне надо сделать триггер, который следит за правильным значением для поля lvl которое содержит уровень вложенности каталога. Кто может помочь?
Неактивен
Игорь, Вам помогут внешние ключи. См. например http://webew.ru/posts/219.webew
Герман, Вам, видимо, придется изнутри триггера вызывать процедуру, которая пересчитывает или как-то еще на клиенте следить.
Сразу скажу, что работать она будет относительно долго.
Приведите для наглядности привести структуру таблиц.
Неактивен