SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.08.2008 13:54:39

игорь
Участник
Зарегистрирован: 26.08.2008
Сообщений: 1

error 1442

ситуация такова:
Имеется 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), которое и вызвало этот триггер.
Есть ли пути решения данной проблемы???

Неактивен

 

#2 17.11.2008 13:00:35

Герман Клюшин
Участник
Откуда: Севастополь
Зарегистрирован: 17.11.2008
Сообщений: 13

Re: error 1442

Все намного проще - оставь только один триггер который реально что то удаляет, а при попытке удаления из второй таблицы просто выдавай запрет. В своем интерфейсе (например PHP программе, дай возможность удалять только из первой таблицы.)

Вот у меня аналогичная ситуация - дерево каталогов, и мне надо сделать триггер, который следит за правильным значением для поля lvl которое содержит уровень вложенности каталога. Кто может помочь?


Иисус - Бог неба и земли!

Неактивен

 

#3 19.11.2008 14:57:42

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 848

Re: error 1442

Игорь, Вам помогут внешние ключи. См. например http://webew.ru/posts/219.webew

Герман, Вам, видимо, придется изнутри триггера вызывать процедуру, которая пересчитывает или как-то еще на клиенте следить.
Сразу скажу, что работать она будет относительно долго.
Приведите для наглядности привести структуру таблиц.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson