ネイティブの 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
.