Подтвердить что ты не робот

Способ прервать выполнение скриптов MySQL (возможно, может возникнуть ошибка)?

Мне нужно написать сценарии установки для MySQL (обычно они запускаются с использованием "source [file]" из консоли mysql), которые частично зависят от существующих данных, и есть различия в средах, а это означает, что иногда script не работает. Общим случаем является то, что оператор "SET" с выбором (для определения идентификатора) не находит ничего; console устанавливает значение в NULL. В этом случае я хотел бы, чтобы script потерпел неудачу; Я слышал, что это было бы сделано путем повышения ошибки (с другими БД). Однако похоже, что у MySQL не было возможности сделать это.

Есть ли хорошие способы для отказа в таких условиях? Поскольку в настоящее время обновления не сработают, когда insert пытается использовать null, но даже это не прервет script. В идеале он просто терпит неудачу и прекратится, как только возникнет проблема.

4b9b3361

Ответ 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 );

Единственным недостатком является то, что я не могу настроить сообщение об ошибке: (