Как проверить, действителен ли запрос MySQL, не выполняя его? - PullRequest
11 голосов
/ 18 декабря 2008

Я делаю простой инструмент, который получает строку команд 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 (...) и следить за ошибками, но есть ли способ проверить и другие команды?

Ответы [ 4 ]

8 голосов
/ 18 декабря 2008

Не без знания схемы (например, 'x' таблица?) И написания парсера SQL. Ваш инструмент запросов MySQL должен быть в состоянии выполнить такую ​​проверку (если хотите, intellisense), но я знаю из первых рук, что большинство (бесплатных) инструментов MySQL ужасны.

«Подготовка» запроса будет делать то, что вы хотите, но это проверка во время выполнения, а не проверка во время компиляции - вы, похоже, ищете решение для времени компиляции / офлайн.

6 голосов
/ 18 декабря 2008

В зависимости от вашего движка MySQL и настроек, вы можете начать транзакцию, попробовать запрос и затем выполнить откат. Предполагая, что грязное чтение отключено, это должно сработать.

4 голосов
/ 24 июня 2018

Для подтверждения запроса я использую команду EXPLAIN. Вы можете взять любой запрос SQL и добавить EXPLAIN перед ним и выполнить. Если запрос неправильный, будет возвращена ошибка.

Примеры:

explain select * from users;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | users | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

И неправильный запрос

explain select * from users2;
ERROR 1146 (42S02): Table 'test.users2' doesn't exist

P.S. Объясните работает для вставки, обновления, удаления тоже. Не только выберите

4 голосов
/ 18 декабря 2008

Вы можете создать временную таблицу, чтобы обойти побочные эффекты запроса:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...