我正在制作一个简单的工具,它将获得一串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)
对于SELECT
s,我可以屈服于EXPLAIN
我的需求 - 运行EXPLAIN SELECT (...)
并注意错误,但有没有办法检查其他命令?
不是没有架构知识(例如,'x'是表?)和编写SQL解析器.您的MySQL查询工具应该能够进行这种验证(如果您愿意,可以使用intellisense),但我从第一手经验中了解到,大多数(免费)MySQL工具都很糟糕.
"准备"查询将执行您想要的操作,但是是运行时检查,而不是编译时检查 - 您似乎正在寻找编译时/离线解决方案.
为了验证查询,我使用 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 也适用于插入、更新、删除。不仅选择
归档时间: |
|
查看次数: |
19490 次 |
最近记录: |