SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 06.03.2012 18:57:29

WandererSu
Участник
Зарегистрирован: 06.03.2012
Сообщений: 6

insert из под тригерров дает Duplicate Key

Всем привет

описание структуры:
база имеет ~40 таблиц InnoDb и MyIsam

встала задача логировать все изменения которые делают юзеры

и вот что я напридумывал. на каждой таблице висит по 3 тригера

CREATE TRIGGER `trgafterinsert_имя_таблицы` AFTER INSERT ON `имя_таблицы`
FOR EACH ROW
BEGIN
    ... /*формирую информацию для понимания что было добавленно и кем*/
    INSERT INTO `test` (`ID`) VALUES (NULL); /*изначально был запрос со вставкой новых данных в таблицу логов, но ошибки точно такиеже*/
END;

CREATE TRIGGER `trgafterupdate_имя_таблицы` AFTER UPDATE ON `имя_таблицы`
FOR EACH ROW
BEGIN
    ... /*формирую информацию для понимания что было изменено и кем*/
    INSERT INTO `test` (`ID`) VALUES (NULL); /*изначально был запрос со вставкой измененных данных в таблицу логов, но ошибки точно такиеже*/
END;

CREATE TRIGGER `trgafterdelete_имя_таблицы` AFTER DELETE ON `имя_таблицы`
FOR EACH ROW
BEGIN
    ... /*формирую информацию для понимания что было удалено и кем*/
    INSERT INTO `test` (`ID`) VALUES (NULL); /*изначально был запрос со вставкой удаленных данных в таблицу логов, но ошибки точно такиеже*/
END;

инсерты сыплются в
CREATE TABLE `test` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `DATA` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-----------------------------------------------
описание проблемы:

когда начинается нагрузка на базу (даже не значительная) 500 000 вставок/5 минут в таблицу `test` регестрирующие действия, получаю ошибки

Duplicate entry '136549' for key 1 (для запроса UPDATE `ххххх` SET .....)
Duplicate entry '1008843012731742461-27-14-2012-03-05' for key 1 (для запроса INSERT INTO `ууууу` ....)
Duplicate entry '247037' for key 1 (для запроса INSERT INTO `ттттт` ....)
Duplicate entry '428168' for key 1 (для запроса DELETE FROM `ттттт` ....)
и так далее порядка 20 за 5 минут работы

причем '136549', '247037', '428168 соответствуют номерам PRK из таблицы `test`
a '1008843012731742461-27-14-2012-03-05' вообще нет такого ключа (1008843012731742461 - вот это первичный ключ из таблицы `ууууу`)

помогите понять что я делаю не так!
или может я от mysql требую того что она не может дать?

Неактивен

 

#2 06.03.2012 19:09:48

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: insert из под тригерров дает Duplicate Key

Это не обязательно первичный ключ. Длинный — это вторичный ключ из другой
таблицы (но уникальный, да).

А просто анализировать двоичный журнал не пробовали? Это сильно проще,
и это уже написано и работает.

Неактивен

 

#3 06.03.2012 19:24:50

WandererSu
Участник
Зарегистрирован: 06.03.2012
Сообщений: 6

Re: insert из под тригерров дает Duplicate Key

1008843012731742461 он первичный значит и уникальный

про двоичный журнал, но есть еще некоторые ньюансы которые требуют от меня именно такого решения

если возможность довести до ума этот вариант??

Неактивен

 

#4 07.03.2012 00:50:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: insert из под тригерров дает Duplicate Key

Напишите один триггер, убедитесь, что работает, напишите второй. Скорее всего,
где-то ошиблись. Автоинкремент никогда не выдает повторных значений, поэтому
это или ошибка в СУБД, или где-то всё-таки ошиблись в тексте триггера.

Неактивен

 

#5 07.03.2012 13:48:52

WandererSu
Участник
Зарегистрирован: 06.03.2012
Сообщений: 6

Re: insert из под тригерров дает Duplicate Key

переделал все тригеры, так что они для каждой таблицы имеют вид
CREATE TRIGGER `trgafterinsert_ччч` AFTER INSERT ON `ччч`
FOR EACH ROW
BEGIN
    INSERT INTO `test` (`ID`) VALUES (NULL);
END;

CREATE TRIGGER `trgafterupdate_ччч` AFTER UPDATE ON `ччч`
FOR EACH ROW
BEGIN
    INSERT INTO `test` (`ID`) VALUES (NULL);
END;

CREATE TRIGGER `trgafterdelete_ччч` AFTER DELETE ON `ччч`
FOR EACH ROW
BEGIN
    INSERT INTO `test` (`ID`) VALUES (NULL);
END;

и так для каждой таблицы.
упростить больше нельзя! ))
но проблемы сохроняются.

может ли это быть связанно с багами определенной версии mysql?

Версия сервера: 5.0.75-0ubuntu10-log
Версия протокола: 10

p.s.  SHOW triggers;
Trigger                  | Event   | Table  | Statement | Timing         | Created | sql_mode   |   Definer 
trgafterinsert_ччч   | INSERT |  ччч    |   ...          | AFTER NULL | NULL     |                 |   root@localhost

Неактивен

 

#6 19.03.2012 13:42:10

WandererSu
Участник
Зарегистрирован: 06.03.2012
Сообщений: 6

Re: insert из под тригерров дает Duplicate Key

ответ тут, пишу на всякий случай может у кого-то будут такие же проблемки

http://bugs.mysql.com/bug.php?id=26316

Неактивен

 

#7 19.03.2012 18:31:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: insert из под тригерров дает Duplicate Key

Угу. И ветку 5.0 не обновили sad

Спасибо за ссылку.

Неактивен

 

Board footer

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