web-dev-qa-db-ja.com

.sqlファイルのSQL構文を確認するにはどうすればよいですか?

.sqlファイルのSQL構文を確認するにはどうすればよいですか?

24
maxjackie

これをMySQLクエリブラウザ(GUIツールパッケージの一部)などのクエリブラウザに貼り付け、キーワードと文字列リテラルの色を視覚的に調べて、構文エラーがないかどうかを簡単に確認できます。

http://dev.mysql.com/downloads/gui-tools/5.0.html

2
Hardwareguy

基本的なレクサーはsql/sql_Lex.ccに実装されているようです。これを使用/回収して、独自のテストパーサーを構築できます。ただし、これは構文をチェックするだけで、ランタイムエラーはチェックしません。

編集:MySQL 8.0以降については、 。sqlファイルのSQL構文を確認するにはどうすればよいですか? を参照してください。

5
VolkerK

TLDR:

>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"

不思議なことに、mysqlにはこのための組み込みスイッチがありませんが、クエリの前にEXPLAINステートメントを追加することで構文を確認できます。

各ステートメントが1行にあるstatements.sqlファイルがある場合は、すべての行の前にEXPLAINを次のように付加します。

>awk '{print "EXPLAIN " $0}' statements.sql > check.sql

次に、mysqlコマンドラインツールを使用してステートメントを実行し、--forceを使用してエラーが発生しても続行できます。構文が正しくないステートメントについては、エラーが出力されます。

>mysql --force -u user -p database < check.sql

または、エラーのある行のみを表示するには:

>mysql --force -u user -p database < check.sql | grep "ERROR"

中間ファイルを作成せずに、これらすべてを1行で実行できます。

>awk '{print "EXPLAIN " $0}' statements.sql | mysql --force -u user -p database | grep "ERROR"
4
culix

MySQL8.0のSELECT STATEMENT_DIGEST_TEXTは、MySQLクエリ構文の検証に使用できます。

8.0.4>SELECT STATEMENT_DIGEST_TEXT('FLUSH TABLES')\G
STATEMENT_DIGEST_TEXT('FLUSH TABLES'): FLUSH TABLES 

8.0.4>SELECT STATEMENT_DIGEST_TEXT("SET GLOBAL second_cache.key_buffer_size=128*1024;")\G
STATEMENT_DIGEST_TEXT("SET GLOBAL second_cache.key_buffer_size=128*1024;"): SET GLOBAL `second_cache` . `key_buffer_size` = ? * ? ;

8.0.4>SELECT STATEMENT_DIGEST_TEXT("create TABLE t1 ( a2 int unsigned not null, b2 int unsigned not null, c2 int unsigned not null, primary key (a2), index b2x (b2), index c2x (c2) ) ENGINE=MEMORY;")\G
STATEMENT_DIGEST_TEXT("create TABLE t1 ( a2 int unsigned not null, b2 int unsigned not null, c2 int unsigned not null, primary key (a2), index b2x (b2), index c2x (c2) ) ENGINE=MEMORY;"): CREATE TABLE `t1` ( `a2` INTEGER UNSIGNED NOT NULL , `b2` INTEGER UNSIGNED NOT NULL , `c2` INTEGER UNSIGNED NOT NULL , PRIMARY KEY ( `a2` ) , INDEX `b2x` ( `b2` ) , INDEX `c2x` ( `c2` ) ) ENGINE = MEMORY ; 

SQLがサポートされていない場合、エラーが発生します。次のものと同様ですが、この応答には特別なものがあります。

8.0.4>SELECT STATEMENT_DIGEST_TEXT('HELP SELECT')\G
ERROR 3676 (HY000): Could not parse argument to digest function: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT' at line 1".

何が特別だったのか分かりましたか? 'HELP'は有効ですが、クライアント側のみのキーワードであり、サーバーキーワードではないのは事実です。いずれにせよ、無効なSQLステートメントは同様の状況を生み出します。エラー。

したがって、ERRORとNO ERRORに基づいて、渡されたSQL構文が有効かどうかを確認できます(クライアント側のみのコマンドの非常に限られたセットを除きますが、ほとんどの人は興味がありません)。

概要; SELECT STATEMENT_DIGEST_TEXTは包括的なSQLパーサーです(直接/意図された関数ではない場合があります)。これを使用して、ステートメントの有効性を実際に実行せずにすばやくチェックできます。 SQLの有効性の検証に関する限り、これは大きな進歩です。

このためには、MySQLサーバーを稼働させる必要があることに注意してください。 mysql -eクライアントを使用してクエリを渡すか、mysqlなどにパイプを渡すことができます。

2

MySQLデータベースに接続したり、スクリプトを貼り付けて検証したりできる無料/試用版の製品がいくつかあります。 Googleはここであなたの友達です。 MimerはANSI-標準構文検証をチェックします しかし、おそらくMySQLの詳細を処理しません。

2

実行するだけです。

トランザクションを開始します

実行

ロールバック

1
KM.

いくつかの可能性があります。トランザクションをサポートするInnoDBテーブルを使用している場合は、.sqlファイルの先頭でstart transaction;を実行し、末尾でrollback;を実行するだけです。 MySQLは構文エラーを出力します。

UPDATEまたはDELETEステートメントをテストしている場合は、最後にLIMIT 0を追加して、これらのクエリがデータベースを変更しないようにし、MySQLに構文をチェックさせることができます。

1
Travis Beale