1

すべてのテーブルを削除するスクリプトがあります。

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL;

SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
  FROM information_schema.tables 
  WHERE table_schema = 'mydb';

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET FOREIGN_KEY_CHECKS = 1; 

少なくとも1つのテーブルが存在する場合、完全に機能するのは1回だけです。2回目の実行でエラーが発生します:

SQL 構文にエラーがあります。1行目のSQL.sql 9 1の近くで「NULL」を使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

IF ステートメントを使用しようとしていますが、まだ機能しません。

IF @tables IS NOT NULL THEN
  SET @tables = CONCAT('DROP TABLE ', @tables);
  PREPARE stmt FROM @tables;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END IF;

SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルで、1 行目の SQL.sql 8 1 の近くで 'if @tables IS NOT NULL THEN SET @tables = CONCAT('DROP TABLE ', @tables)' を使用する正しい構文を確認してください。

この場合、IF を使用する正しい方法は何ですか?

4

1 に答える 1

2

セッション変数に値を割り当ててクエリで同じ値を使用すると、
その値がプレースホルダーを置き換えます。そしてその理由により、

SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables

になる

SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO NULL  

これはまったく意味がありません。

代わりに、値を事前に設定せずに変数を直接使用する必要があります。
だから使わないで

SET @tables = NULL;

次に、ステートメント ブロックは、そのスコープがブロックの下で定義されていない限り、データベース エンジンによって直接コンパイルできません。これは通常、ストアド プロシージャまたはトリガーを使用して行われます。プロシージャ内の場合、それらは ~ の間にある必要がBEGINありENDます。

したがって、次は間違っています。

IF @tables IS NOT NULL THEN
  SET @tables = CONCAT('DROP TABLE ', @tables);
  PREPARE stmt FROM @tables;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END IF;

スコープ変数を使用するには、ストアド プロシージャ用に定義された構文に従う必要があります。

以下に示すように、同様の質問に対する私の回答を参照してください。

  1. MySQL 構文エラー
  2. 参照:変数の宣言とスコープ.
于 2014-02-17T10:24:07.070 に答える