Как проверить, является ли запрос MySQL действительным без его выполнения?
Я делаю простой инструмент, который получит строку команд MySQL и запустит ее (на нескольких серверах БД последовательно). Я доверяю пользователям быть разумными, но ошибки случаются, и я ищу способ предотвратить основные опечатки:
Есть ли способ проверить во время выполнения (относительно простые) запросы MySQL, чтобы убедиться, что они синтаксически правильны?
Я не ищу семантической корректности, например. имена таблиц или возможность присоединения; просто что-то вроде проверки орфографии для SQL-запросов.
Другими словами,
SELECT * FROM x;
или
INSERT INTO x SET id=1,bar="foo";
будет отмечен как действительный, тогда как любой из них не будет:
SELECT FROM x;
SECLET * RFOM x;
ISNETR INTO x SET id=1;
HJBGYGCRYTCY;
Для SELECT
s, я мог бы сгибать EXPLAIN
к моим потребностям - запускать EXPLAIN SELECT (...)
и следить за ошибками, но есть ли способ проверить и другие команды?
Ответы
Ответ 1
Не зная схемы (например, это "x" таблица?) и написания анализатора SQL. Ваш инструмент запросов MySQL должен иметь возможность выполнять такую проверку (intellisense, если хотите), но я знаю из первых рук, большинство (бесплатных) инструментов MySQL являются ужасными.
"Подготовка" запроса будет делать то, что вы хотите, но это проверка времени выполнения, а не проверка времени компиляции - вы, похоже, ищете решение для компиляции/автономного решения.
Ответ 2
В зависимости от вашего двигателя и настроек MySQL вы можете начать транзакцию, попробовать запрос и выполнить откат. Предполагая, что грязные чтения отключены, это должно работать.
Ответ 3
Вы можете создать временную таблицу, чтобы обойти побочные эффекты запроса:
CREATE TEMPORARY TABLE users SELECT * FROM users;
INSERT INTO users(name) VALUES('UniqueName');
DROP TABLE users;
SELECT * FROM users WHERE name='UniqueName'; -- Should return 0 results