Во-первых, весь код работает правильно. Он просто не делает то, что ожидал.
Во-вторых, «Не начинайте отсюда», или, в частности, не используйте триггеры. В основном это будет принудительное переключение на обработку на уровне строк, если триггеры будут срабатывать для каждой строки. Лучше фактически поместить логику в хранимую процедуру, которую вы вызываете. Затем у вас есть начало (где вы проверяете входные данные), а также конец и логический путь на всем пути. Их намного легче отлаживать, если вы идете по одному пути.
Три, Никогда не проверяйте на ошибку, которую вы не знаете, как обработать. Если вы не уловили его, он всплывает к клиенту, который получает сообщение об ошибке, в котором говорится, что пошло не так (сообщение об ошибке) и где (то есть стек ошибок / вызовов) Если вы пытаетесь поймать это, вы должны знать, что с ним делать (и если вы не знаете, тенденция игнорировать это - что ПЛОХО).
Наконец, вы не можете легко увидеть каждый «слой» выбора. План объяснения, как правило, расскажет вам, как идут дела. v $ session_longops МОЖЕТ указывать, что он в данный момент делает. Текущее событие ожидания МОЖЕТ подсказать, над какой таблицей / блоком / строкой оно в данный момент работает.