2010-03-01 1 views
3

Я использую mysql, и есть объемные вставки, которые идут в мою таблицу. Мое сомнение в том, что я создаю триггер с указанием after insert, тогда триггер активируется для каждого insert after, чего я не хочу.как активировать триггер после всех объемных вставок в mysql

Есть ли способ активировать триггер после завершения всех объемных вставок?

Любые советы?

Спасибо.

+0

Postgresql дебютировал триггеры, не знаю, предлагает ли Mysql их. – ChristopheD

+0

mysql предлагает триггеры. – JPro

+0

Из документов Mysql: «InnoDB немедленно проверяет ограничения внешнего ключа, проверка не переносится на транзакцию». Таким образом, его механизм хранения –

ответ

1

Если ваша проблема - это производительность, вы можете быть уверены, что операция выполняется довольно быстро, даже если она выполняется по каждой вставленной строке отдельно. Но если вы действительно думаете, что это приведет к проблемам с производительностью, вы должны профиль.

Единственная альтернатива, о которой я могу думать, это сбросить триггер, выполнить запрос вставки и повторно добавить триггер, что на самом деле является ужасным решением (к сожалению, вы не можете отключить триггеры для сеанса в mysql - на самом деле вы не можете отключить их вообще).

+0

обновил вопрос – JPro

0

Синтаксис триггера (после вставки на < <) по сути говорит, что это будет сделано для каждой вставки. Я не знаю, как это отключить. Возможным обходным решением может быть наличие флага (какое-то волшебное значение для одного из столбцов, например, столбец идентификатора -200?) В вашем заявлении вставки, который действителен только для самой последней вставки, а затем имеет оператор if, являющийся вашим триггером, который проверяет флаг. Хотя это немного похоже на хак. Возможно, вы можете дать нам немного больше контекста, может быть лучший способ скинирования этого кота.

+0

. Некоторые внешние источники расширяют мою базу данных, и я хочу заполнить некоторые дополнительные файлы на основе значений, которые он поставляет, что для той же таблицы, кстати. Хотя это может вызвать конфликт, когда триггер активируется и пытается обновить таблицу, а другая вставка для той же таблицы. Есть идеи? – JPro

+0

У вас нет документов, подтверждающих это, но триггер, вероятно, завершит работу до того, как будет вставлена ​​следующая строка. Даже если нет, mysql будет обрабатывать блокировку для вас. Innodb поддерживает блокировку на уровне строк, что означает, что если один поток занят обновлением строки, другие не смогут его обновить. Не думайте, что вам нужно беспокоиться о конфликтах. Вы хотите обновить поля в той же строке, для которой активирован триггер, для того, чтобы вы вставляли/обновляли другую строку? –

+0

содержит следующие ошибки: «ОШИБКА: ODBC: состояние S1000: [MySQL] [драйвер ODBC 5.1] [mysqld-5.1.37] Не удается обновить таблицу« my_table »в хранимой функции/триггере, поскольку она уже используется выражением, которое вызывается эта сохраненная функция/триггер. – JPro

2

посмотрите here и посмотреть, если вы можете реализовать этот трюк, который в основном оборачивает на курок, если заявление управляется переменной, которую можно включать и выключать

if (@DISABLE_TRIGER <> 1) then 
#trigger body 
end if; 

и чем, если вы хотите, чтобы отключить триггеры при ввозе только:

SET @DISABLE_TRIGER = 1; 

#do imports 

SET @DISABLE_TRIGER = 0; 
Смежные вопросы