Я думаю, что вы на правильном пути с этой мыслью:
Это случай, хотя триггер "ПОСЛЕ ВСТАВКИ", вставка на самом деле не произошла, поэтому она можетt обновить строку, которую он только что вставил?
Из FAQ :
B.5.9: Могут ли триггеры обращаться к таблицам?
Триггер может обращаться как к старым, так и к новым данным в своей собственной таблице.Триггер также может влиять на другие таблицы, но нельзя изменять таблицу, которая уже используется (для чтения или записи) оператором, который вызвал функцию или триггер.
Документация нене ясно, что то, что вы делаете, не сработает.OTOH, документация не ясна, что то, что вы пытаетесь сделать, тоже будет работать.
Я думаю, вам было бы лучше использовать триггер BEFORE INSERT
и установить там NEW.rank
.Тогда новая строка будет иметь правильное значение rank
, когда она будет вставлена в таблицу, а не исправлена после нее.Кроме того, вы сможете упростить проверку своего существования до следующего:
EXISTS(SELECT rank FROM mytable WHERE parent_id = new.parent_id)
, поскольку NEW.id
не будет иметь полезного значения, и новая строка в любом случае не будет в таблице;ORDER BY
и LIMIT
также не нужны, так как вы просто проверяете, существует ли что-то, поэтому я их убрал.
Триггер BEFORE INSERT
, кажется, все равно лучше соответствует вашим намерениям, и это даст вам правильные данные, как только они будут вставлены в вашу таблицу.