1

更新クエリを実行したい。

クエリは複数のデータベースに対して実行されます。すべてのデータベースにテーブルがあるわけではありません。

テーブルが存在しない場合、更新を試行したくありません。エラーがスローされるのは望ましくありません。更新を無視したいだけです。

何か案は?

編集:明確にするために-クエリは自動展開で実行されます-人間の操作は不可能です。

EDIT2: 更新を実行する必要があるかどうかを示すロジックは、MySql クエリ自体に含まれている必要があります。これは、コマンド プロンプト、バッチ、またはマネージ コードを通じて実行されていません。

4

3 に答える 3

2

ネイティブの MySQL (mysql スクリプトのように) でこれを行うには、ストアド プロシージャを使用できます。

これは、1 回限りの管理タイプの機能に適しています。アプリケーションの一部としてこれを実行することは望ましくありません。(繰り返しますが、これがアプリケーションの一部である場合は、UPDATE を実行するかどうかを制御したり、テーブルが存在しない場合に例外をキャッチして処理したりするための条件付きロジックが必要になります。)

CONTINUE HANDLERを使用してエラー 1146 (テーブルが存在しません) をキャッチしてそれを飲み込み、呼び出し元にエラーが返されないようにするストアド プロシージャの例を次に示します。


DELIMITER //
DROP PROCEDURE IF EXISTS `table_doesnt_exist_handler`//
CREATE DEFINER=`root`@`%` PROCEDURE `table_doesnt_exist_handler`()
BEGIN
  DECLARE table_doesnt_exist BOOLEAN;
  DECLARE CONTINUE HANDLER FOR 1146 SET table_doesnt_exist = TRUE;

  UPDATE table_doesnt_exist SET foo = 1 WHERE foo = 1;

END//
CALL `table_doesnt_exist_handler`()//
DROP PROCEDURE IF EXISTS `table_doesnt_exist_handler`//
DELIMITER ;

もう 1 つのオプションは、テーブルの存在をテストし、条件付きでステートメントを実行することです。ネイティブの MySQL でも、これはストアド プロシージャ内で行う必要があります。

DELIMITER //
DROP PROCEDURE IF EXISTS `table_doesnt_exist_approach_2`//
CREATE DEFINER=`root`@`%` PROCEDURE `table_doesnt_exist_approach_2`()
BEGIN
  SELECT @table_exists := COUNT(1) AS table_exists
    FROM information_schema.tables
   WHERE table_schema = DATABASE() 
     AND table_name = 'table_doesnt_exist';
  IF  @table_exists > 0 THEN
    UPDATE table_doesnt_exist SET foo = 2 WHERE foo = 1;
  END IF;
END//

CALL `table_doesnt_exist_approach_2`()//
DROP PROCEDURE IF EXISTS `table_doesnt_exist_approach_2`//
DELIMITER ;

私の好みは、CONTINUE HANDLER.

于 2012-07-06T15:14:44.000 に答える
0

テーブル名に記述を行うようなことを行うことができ、結果が空の場合は更新を実行しないでください。短いスクリプトでこれを行うことができますが、使用している言語はわかりません。ここで厳密にDBを見ている場合は、おそらくストアドプロシージャで管理することもできます。

于 2012-07-06T14:55:30.963 に答える
0

最初にクエリを実行して、そのテーブルが存在するかどうかを確認してから、実際のクエリを実行できます。

元:

table_exists_query = Select count(*) from INFORMATION_SCHEMA.tables where table_name='xxxx';

if(run_query(table_exists_query)==1) 実際のクエリを実行します

于 2012-07-06T14:58:42.793 に答える