我正在制作一个简单的工具,它将获取一串 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
,我可以根据我的需要调整 EXPLAIN
- 运行 EXPLAIN SELECT (...)
并观察错误,但是还有没有办法检查其他命令?
为了验证查询,我使用 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
附注解释也适用于插入、更新、删除。不仅选择
必须了解模式(例如,“x”是表吗?)并编写 SQL 解析器。你的 MySQL 查询工具应该能够进行这种验证(如果你愿意的话,可以进行智能感知),但我从第一手经验中知道,大多数(免费)MySQL 工具都很糟糕。
“准备”查询会执行您想要的操作,但这是运行时检查,而不是编译时检查 - 您似乎正在寻找编译时/离线解决方案。
根据您的 MySQL 引擎和设置,您可以启动事务,尝试查询,然后进行回滚。假设脏读关闭,那应该可以工作。
您可以创建一个临时表来避免查询的副作用:
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
您可以使用您的代码和唯一名称临时创建一个存储过程。 然后你就可以立即放下它。事务无法回滚 SP 创建。 但要小心,因为它只是语法验证,所以它不会检查对象(在您的查询中)是否存在。
从员工中删除,其中columnname='salary';