如何检查MySQL查询是否有效而不执行它?

Pis*_*3.0 11 mysql validation

我正在制作一个简单的工具,它将获得一串MySQL命令并运行它(在几个DB服务器上顺序运行).我相信用户是明智的,但错误发生了,我正在寻找一种方法来防止基本的拼写错误:

有没有办法在运行时验证(相对简单的)MySQL查询,看看它们在语法上是否正确?

我不是在寻找语义正确性,例如表名或连接适用性; 就像SQL查询的拼写检查一样.

换一种说法,

SELECT * FROM x;
Run Code Online (Sandbox Code Playgroud)

要么

INSERT INTO x SET id=1,bar="foo";
Run Code Online (Sandbox Code Playgroud)

将被标记为有效,而其中任何一个都不会:

SELECT FROM x;
SECLET * RFOM x;
ISNETR INTO x SET id=1;
HJBGYGCRYTCY;
Run Code Online (Sandbox Code Playgroud)

对于SELECTs,我可以屈服于EXPLAIN我的需求 - 运行EXPLAIN SELECT (...)并注意错误,但有没有办法检查其他命令?

Jam*_*den 8

不是没有架构知识(例如,'x'是表?)和编写SQL解析器.您的MySQL查询工具应该能够进行这种验证(如果您愿意,可以使用intellisense),但我从第一手经验中了解到,大多数(免费)MySQL工具都很糟糕.

"准备"查询将执行您想要的操作,但是是运行时检查,而不是编译时检查 - 您似乎正在寻找编译时/离线解决方案.


Rom*_*juk 7

为了验证查询,我使用 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  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
Run Code Online (Sandbox Code Playgroud)

和错误的查询

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

PS Explain 也适用于插入、更新、删除。不仅选择


Eli*_*Eli 6

根据您的MySQL引擎和设置,您可以启动事务,尝试查询,然后执行回滚.假设脏读是关闭的,那应该可行.