Чтобы ответить на поставленный вопрос вы, о выдаче условно ROLLBACK заявление:
Это не может быть сделано в контексте одного оператора SQL.
Нам нужно запустить отдельный запрос, который возвращает результат, извлекает результат и затем использует этот результат для сравнения в if/else и выдает отдельный оператор SQL ROLLBACK.
Мы могли бы продемонстрировать, как это сделать в хранимой программе MySQL; но в вопросе конкретно не упоминается использование процедуры.
Или же такие же шаги могут быть выполнены в клиентской программе, выпуская отдельные инструкции SQL для запроса SELECT и ROLLBACK.
Я подойду к дизайну по-разному. Если мы сможем заранее определить, прежде чем мы когда-нибудь опубликуем заявление INSERT, мы хотели бы выполнить ROLLBACK транзакцию ... тогда мы могли бы избежать выполнения INSERT в первую очередь. И избегая ненужных накладных расходов, анализируя заявление, получая блокировки, записывая в журнал, генерируя откат, теряя AUTO_INCREMENT и т. Д.
В контексте хранимой программы MySQL (например, ПРОЦЕДУРА) вы можете выполнить команду SELECT COUNT() INTO var
, а затем использовать блок IF THEN ELSE для проверки значения переменной. Или вы можете настроить обработчик CONTINUE для обработки конкретного исключения.
Но в этом вопросе особо не упоминается, что это в контексте хранимой в MySQL программы.
Лично я подошел бы к дизайну немного по-другому.
Мне интересно, почему это проблема, что есть две или более строк со значением 'Cash'
для job_type_name
.
Я понимаю, почему это вызвало бы проблемы для инструкции INSERT, показанной в этом вопросе, то ВЫБРАТЬ запрос возвращение более чем один ряд будет выдавать ошибку в контексте находится.
Но есть исправления для что. Мы можем взять самое низкое или самое высокое значение, использовать агрегат MIN()
или MAX()
или добавить ORDER BY ... LIMIT 1
, или мы могли бы добавить дополнительные критерии, которые гарантировали бы возврат одного значения.
Мне интересно, если job_type_name
быть УНИКАЛЬНЫМ в таблице job_type
. Или нас беспокоит только то, что значение 'Cash'
происходит только один раз.
Рассматривая вопрос, я не могу не задаться вопросом, нужно ли это условно откатывать транзакцию, являясь симптомом более сложной проблемы дизайна.
Если вы хотите задать вопрос, я думаю, что здесь происходит больше. Я бы сделал несколько шагов назад и пересмотрел предлагаемый дизайн.
Отказавшись от сделки, вы имеете в виду откат первой вставки? – RiggsFolly
@FlorianHeer Я не вижу, что как цель обмана – Drew
выберите счетчик (*) в var и сделайте блок 'if' – Drew