English 中文(简体)
如何在不执行MySQL查询的情况下检查其是否有效?
原标题:
  • 时间:2008-12-18 13:47:18
  •  标签:

我正在制作一个简单的工具,它将获取一个MySQL命令字符串并运行它(在多个数据库服务器上按顺序运行)。我相信用户会明智,但错误难免会发生,我正在寻找一种防止基本打字错误的方法:

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

我不寻求语义上的正确性,例如表名或连接适用性;只是像 SQL 查询的拼写检查一样的东西。

换句话说,

SELECT * FROM x;

或者 (Huòzhě)

INSERT INTO x SET id=1,bar="foo";

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

SELECT FROM x;
SECLET * RFOM x;
ISNETR INTO x SET id=1;
HJBGYGCRYTCY;

F或者 (Huòzhě) SELECTs, I could bend EXPLAIN to my needs - run EXPLAIN SELECT (...) and watch f或者 (Huòzhě) err或者 (Huòzhě)s, but is there a way to check f或者 (Huòzhě) other commands as well?

最佳回答

不了解模式(例如,x是一个表吗?)并编写SQL解析器是不可能的。您的MySQL查询工具应该能够执行这种类型的验证(如果您喜欢可以进行智能感知),但根据我第一手的经验,大部分(免费的)MySQL工具都很糟糕。

准备查询可以实现您想要的功能,但这是一个运行时检查,而不是编译时检查 - 您似乎正在寻找一种编译时/离线解决方案。

问题回答

To verify a query i use the EXPLAIN command. You can take any SQL query and add EXPLAIN before it and execute. If query is wrong, error will be returned.

例子:

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  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

错误的查询 (Cuòwù de cháxún)

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

P.S. 解释适用于插入、更新、删除操作,不仅仅是查询操作。

根据您的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

You can temporarily create a stored procedure with your code and unique name. Then you can drop it immediately. Transactions can t rollback SP creation. But be careful, because it just syntax validation, so it doesn t check if an object (in your query) exists or not.





相关问题
热门标签