如何检查MySQL查询是否有效而不执行?
问题描述:
我正在制作一个简单的工具,它将获得一串MySQL命令并运行它(依次在多个数据库服务器上运行)。我相信用户是明智的,但出现错误,我正在寻找一种方法来防止基本的错别字:如何检查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 (...)
并注意错误,但是有没有是否也检查其他命令?
答
不知道模式(例如,'x'是一个表?)并编写SQL解析器。你的MySQL查询工具应该能够进行这种验证(如果你喜欢,可以使用intellisense),但是我从第一手的经验知道,大多数(免费)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
答
根据您的MySQL引擎和设置,你可以开始交易时,尽量查询,然后执行回滚。假设肮脏的读取关闭,这应该工作。
我正在寻找一种在脚本执行之前检查查询的快速方法。编写一个解析器可能会过度 - 如果它在第一台服务器上出现故障,它就会退出并显示一个错误(据说脚本用户(系统管理员)已经足够清楚了解他们在做什么)。 – Piskvor 2008-12-18 14:09:40
+1准备。这是我知道的唯一方法。 – willasaywhat 2008-12-18 20:25:19