Способ прервать выполнение скриптов MySQL (возможно, может возникнуть ошибка)?
Мне нужно написать сценарии установки для MySQL (обычно они запускаются с использованием "source [file]" из консоли mysql), которые частично зависят от существующих данных, и есть различия в средах, а это означает, что иногда script не работает. Общим случаем является то, что оператор "SET" с выбором (для определения идентификатора) не находит ничего; console устанавливает значение в NULL. В этом случае я хотел бы, чтобы script потерпел неудачу; Я слышал, что это было бы сделано путем повышения ошибки (с другими БД). Однако похоже, что у MySQL не было возможности сделать это.
Есть ли хорошие способы для отказа в таких условиях? Поскольку в настоящее время обновления не сработают, когда insert пытается использовать null, но даже это не прервет script. В идеале он просто терпит неудачу и прекратится, как только возникнет проблема.
Ответы
Ответ 1
Я думаю, что вы сталкиваетесь с ограничением консоли MySQL. Учитывая список инструкций, консоль MySQL выполняет каждый из них независимо от любых возникших ошибок. Даже если вы внедрили некоторые из предложений об устранении ошибок, о которых упоминались в предыдущих комментариях, консоль MySQL не перестанет выполняться при возникновении такой ошибки.
Я предполагаю, что у вас нет ресурсов для применения языка сценариев к проблеме, которая могла бы выполнить ваш SQL для вас и обрабатывать ошибки. Я думаю, в этом случае вам нужен только более надежный инструмент, чем консоль MySQL.
Администратор MySQL делает то, что вам нужно, если я правильно понимаю вашу проблему. Если вы настроили соединение с MySQL и подключились к базе данных, у вас есть два инструмента из меню "Инструменты". Обычная консоль MySQL есть, но у вас также есть MySQL Query Browser.
Если вы откроете браузер запросов, вы получите достойный графический интерфейс для своих баз данных MySQL. Файл → Открыть Script, чтобы открыть SQL script, а затем использовать кнопку Execute.
Вы получаете хороший индикатор выполнения, и, что более важно, из его звуков, если запрос завершается с ошибкой, выполнение Script останавливает и выделяет неудавшийся запрос. Вы можете пропустить его и продолжить, или даже вручную изменить свои данные и начать с места где-нибудь дальше по script.
Я покинул консоль MySQL почти сразу после того, как узнал об этом и попробовал Administrator.
Ответ 2
У меня была та же проблема, и GUI для меня не вариант. Вот как я это решил:
DELIMITER $$
DROP FUNCTION IF EXISTS sfKillConnection $$
CREATE FUNCTION sfKillConnection() RETURNS INT
BEGIN
SELECT connection_id() into @connectionId;
KILL @connectionId;
RETURN @connectionId;
END $$
DELIMITER ;
Это функция вместо процедуры, поэтому ее можно вызвать в script следующим образом:
select if(@error, sfKillConnection(), 0);
Вероятно, вам нужно запустить клиент mysql с опцией --disable-reconnect
.
Ответ 3
MySQL Workbench теперь заменяет администратора MySQL.
Использовать 'Переключить, должно ли выполнение SQL script продолжаться после неудачных операторов
![Toggle whether execution of SQL script should continue after failed statements]()
Ответ 4
Здесь вы можете выполнить свои команды обновления только в том случае, если определенная версия на месте.
Это уродливо, но все, что я могу предложить для mysql 5.
DELIMITER $$
DROP FUNCTION IF EXISTS `Upgrade_Build`$$
CREATE FUNCTION `Upgrade_Build`(bversion INT) RETURNS varchar(30)
BEGIN
IF bversion = (SELECT MIN(`db_version`) FROM `system`) THEN
UPDATE `pages`
SET `component_parameters` =
REPLACE(`component_parameters`,'folderviewer_','folder_viewer.');
UPDATE `system`
SET `db_version` = bversion+1;
return CONCAT('Success: ',bversion,' > ',bversion+1);
ELSE
return CONCAT('Failed - Version is ',(SELECT MIN(`db_version`) FROM `system`));
END IF;
END$$
DELIMITER ;
Чтобы использовать его, выполните следующие действия:
SELECT Upgrade_Build(1327);
Вы увидите что-то вроде этого, если текущая версия WAS 1327:
Успех: 1327 > 1328
Запустите его второй раз, и вы увидите:
Сбой - версия 1328
Надеюсь, что это кому-то полезно.
Ответ 5
Похоже, KILL QUERY
должен делать то, что вам нужно.
Ответ 6
Здесь используется подход с низким лбом:
Мне нужно было убедиться, что @search_admin_realname
соответствует записи в таблице profiles
; если нет, я хотел бы прервать мой script.
Итак, я сделал это:
select @search_admin_id:= userid
from profiles
where [email protected]_admin_realname
;
# test that @search_admin_id is not null;
# if it is, then the insert will fail and script will abort.
create temporary table t_search_admin_id ( search_admin_id mediumint( 9 ) not null );
insert into t_search_admin_id ( search_admin_id ) values ( @search_admin_id );
Единственным недостатком является то, что я не могу настроить сообщение об ошибке: (