Это специфическое поведение, похоже, ошибка в MySQL , и оно влияет только на BEFORE INSERT
триггеры, в то время как BEFORE UPDATE
триггеры работают правильно.
стандарт (как указано в комментариях к вопросу), конечно, это не прописано явно, но это определенно подразумевается:
Для каждого изменения состояния SCi, j в TECi триггеры BEFORE, активируемые SCi, jвыполняется до того, как какое-либо из их инициирующих событий вступит в силу.Когда эти инициирующие события вступили в силу, выполняются любые триггеры AFTER, активированные изменениями состояния TECi.
Ошибка NOT NULL
должна быть частью INSERT
или UPDATE
(т.е.запускающее событие).Стандарт не должен указывать это.Абсолютно не имеет смысла для упреждающей проверки ограничений на набор изменений, который не является окончательным, поскольку ваш BEFORE
триггер способен разрешать как ошибки , так и , вносящие новые.
РЕЗЮМЕ: Это действительно не зависит от поставщика БД, потому что проверка ограничений после триггера до * всегда необходима.