MySQL error #2014 - команды не синхронизированы; Вы не можете запустить эту команду сейчас
Я использую MySQL, и я определяю хранимую процедуру следующим образом:
delimiter ;;
Create procedure sp_test()
select * from name_table;
end
Когда я пытаюсь выполнить эту процедуру, я получаю эту ошибку:
#2014 - Commands out of sync; you can't run this command now
Что это значит и что я делаю не так?
15 ответов
Из руководства
C.5.2.14. Команды не синхронизированы
Если вы получаетеCommands out of sync; you can't run this command now
в своем клиентском коде вы вызываете клиентские функции в неправильном порядке.Это может произойти, например, если вы используете
mysql_use_result()
и попробуйте выполнить новый запрос, прежде чем позвонитьmysql_free_result()
, Это также может произойти, если вы попытаетесь выполнить два запроса, которые возвращают данные без вызоваmysql_use_result()
или жеmysql_store_result()
между.
Этот пост (взято отсюда)
Я решил эту проблему. Я использую MySQL-Fron вместо браузера MySQL Query. И все работает отлично.
заставляет меня думать, что это не проблема сервера или базы данных, а проблема в инструменте, который вы используете.
В моем случае в моей хранимой процедуре была следующая структура:
DELIMITER //
DROP PROCEDURE IF EXISTS processcolumns;
CREATE PROCEDURE processcolumns ()
BEGIN
(...)
END //
DELIMITER ;
CALL processcolumns ();
DROP PROCEDURE processcolumns;
Проблема здесь:
DROP PROCEDURE IF EXISTS processcolumns;
Я удалил точку с запятой
;
и заменил его разделителем
//
как это:
DROP PROCEDURE IF EXISTS processcolumns //
И теперь это решено!
Мне удалось воспроизвести эту ошибку с MySQL и phpmyadmin:
#2014 - Commands out of sync; you can't run this command now
На этой версии MySQL:
el@apollo:~$ mysql --version
mysql Ver 14.14 Distrib 5.5.34, for debian-linux-gnu (x86_64) using readline 6.2
С помощью следующего SQL запустите окно запроса phpmyadmin:
use my_database;
DELIMITER $$
CREATE PROCEDURE foo()
BEGIN
select 'derp' as 'msg';
END $$
CALL foo()$$ <----Error happens here, with or without delimiters.
Я не мог получить ошибку через терминал mysql, поэтому я думаю, что это ошибка phpmyadmin.
На терминале работает нормально:
mysql> delimiter $$
mysql> use my_database$$ create procedure foo() begin select 'derp' as 'msg'; end $$ call foo() $$
Database changed
Query OK, 0 rows affected (0.00 sec)
+------+
| msg |
+------+
| derp |
+------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Я думаю, что ошибка связана с изменением промежуточного запроса разделителей в phpmyadmin.
Обходной путь : Замедлите своего ковбоя и запускайте операторы SQL по одному при использовании phpmyadmin. phpmyadmin - это "одиночный боб", он может выполнять только одну работу.
Возможная причина в том, что клиент mysql в вашем коде не является потокобезопасным, я столкнулся с той же ошибкой, когда я вызываю mysqldb в python, у меня есть один интерфейс mysql, используемый в 2 потоках, ошибка возникает. В этой ситуации вам нужно создать больше интерфейсов mysql вместе с потоками.
Я исправил эту проблему на phpMyAdmin 4.8.6
Проблема: https://github.com/phpmyadmin/phpmyadmin/issues/14614
Запрос на извлечение: https://github.com/phpmyadmin/phpmyadmin/pull/15234
Патч: https://github.com/phpmyadmin/phpmyadmin/pull/15234/files
Патч состоит из, и если mysqli_more_results, то вызов mysqli_next_result
delimiter ;;
Create procedure sp_test()
select * from name_table;
end ## no end here, must add ;; after end. should be
delimiter ;;
Create procedure sp_test()
select * from name_table;
end ;;
Вы забыли использовать ключевое слово "Begin", и во время компиляции MySQL запутался, это должно сработать:
DELIMITER ;;
Create procedure sp_test()
BEGIN
select * from name_table;
END;;
DELIMITER ;
Предположим, что когда вы создали хранимую процедуру, вы сохранили ее в базе данных с именем mydatabase
ВЫЗВАТЬ процедуру. Перейдите в свою локальную базу данных и:
CALL mydatabase.sp_test();
куда sp_test()
это название вашей процедуры.
Похоже, у этой проблемы есть несколько источников. Ни один из опубликованных ответов не работал в моем случае, я обнаружил, что в моем случае у меня были выборки и обновления в таблице в моей хранимой процедуре, в той же таблице был триггер обновления, который запускался и отправлял процедуру в бесконечный цикл. Как только ошибка была обнаружена, ошибка исчезла.
Я также воспроизвел проблему в случае, когда у меня был выбор, который вызывал функцию, изменявшую таблицу. Имеет смысл, что эти типы рекурсивных вызовов могут создавать проблемы. Проблемы были решены обновлением таблицы tmp и, в конце концов, обновлением исходной таблицы из таблицы tmp.
Я прочитал весь этот пост, но я не могу применить какие-либо проблемы / решения к моей ошибке «Код: 2014 Команды не синхронизируются ОШИБКА; вы не можете запустить эту команду сейчас». Я создал / загрузил таблицы нормально, но мой триггер не работает с ошибкой 2014. Я переместил ";" в разные места, никуда. Я манипулировал созданной мной переменной и кнопкой «Обновить», нет. Я не могу точно определить причину проблемы. Есть идеи, пожалуйста?
Use Sakila; /* Create 1st BEFORE DELETE trigger */ DELIMITER $$ DROP TRIGGER IF EXISTS Before_Salary_Table_Delete; CREATE TRIGGER Before_Salary_Table_Delete BEFORE DELETE ON salaries FOR EACH ROW BEGIN SET @message = ‘This record was deleted’ INSERT INTO SalaryLogAudit(employeeNumber,validFrom,amount,ActionTaken) VALUES(OLD.employeeNumber,OLD.validFrom,OLD.amount) UPDATE SalaryLogAudit SET ActionTaken = @message WHERE employeenumber = OLD.employeeNumber; END$$
DELIMITER;
Это происходило со мной, потому что функция внутри процедуры возвращала значение, которое не было присвоено переменной.
Решение было:
select function .... INTO @XX;
У вас есть эта проблема, очевидно, потому что оба оператора выполняются одновременно. Единственный обходной путь, который я нашел, - это закрыть соединение после s p и выполнить другой оператор на новом. Читайте об этом здесь.
У меня была эта ошибка только сейчас из-за изменения кода, которое повторно использовало соединения db в Python. Возврат кода для установления соединения с БД для каждого запроса SQL решил проблему.
Я также столкнулся с этой проблемой с C API.
Я нашел решение с последним примером выше, который говорит о разделителях.
use my_database;
DELIMITER $$
CREATE PROCEDURE foo()
BEGIN
select 'derp' as 'msg';
END $$
CALL foo()$$
Мой код выполняет хранимую процедуру, а затем проверяет возврат. Я правильно использую mysql_free_result().
Так как я не добавил в процедуру предложение select "into", произошла эта ошибка.
Последний пример выше в том же случае.
Я удалил выбор, и так как все в порядке.
Alex
Я только что получил ту же ошибку от phpMYadmin при вызове пользовательской функции, над которой я работаю.
Однако консоль mysql сообщает:
ERROR 1054 (42S22): Unknown column 'latitude' in 'field list'
... что абсолютно правильно, в списке полей была допущена ошибка, поэтому оператор ссылался на неопределенную переменную.
Я должен был бы заключить, что
#2014 - Commands out of sync; you can't run this command now
от phpMYadmin - это довольно неспецифическая ошибка, потому что во многих случаях, если не большинство, просто затеняет реальную проблему, и не стоит тратить слишком много времени, пытаясь разобраться в ней.