Как проверить, является ли запрос 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