言語で実際にスクリプトを作成する必要なく、MySQL でデータベース全体の検索置換を行う最良の方法は何ですか (つまり、それが必要な場合はそうします)。
基本的に、Drupal でサイト名を別のサイト名 (アップグレード用に開発サーバーをセットアップしています) に置き換えたいと考えています。
私の考えでは、データベース内のすべてのリンクを変更する必要があります。これを行うには PHPMyAdmin を使用したいと思いますが、コマンド ラインも使用できます。
言語で実際にスクリプトを作成する必要なく、MySQL でデータベース全体の検索置換を行う最良の方法は何ですか (つまり、それが必要な場合はそうします)。
基本的に、Drupal でサイト名を別のサイト名 (アップグレード用に開発サーバーをセットアップしています) に置き換えたいと考えています。
私の考えでは、データベース内のすべてのリンクを変更する必要があります。これを行うには PHPMyAdmin を使用したいと思いますが、コマンド ラインも使用できます。
次のようなテーブル設定があると仮定します。
sites
site_id
url
REPLACE()
コマンドで使用できますUPDATE
:
UPDATE sites SET url=REPLACE(url, 'findUrl.com', 'replaceUrl.com');
更新:特定のデータベースのすべてのテーブルのすべての列で「検索と置換」の必要性をサポートするには、aStored Procedure
が必要です (もちろん、MySQL で直接実行する場合)。これができることの大まかなドラフト(テストされていない)です:
DELIMITER $$
CREATE PROCEDURE `find_replace_in_all_tables`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE TABLE_NAME CHAR(255);
DECLARE COLUMN_NAME CHAR(255);
DECLARE tables CURSOR for
SELECT table_name, column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN tables;
WHILE done = 0 DO
FETCH NEXT FROM tables INTO TABLE_NAME, COLUMN_NAME;
IF done = 0 THEN
SET @SQL_TEXT = CONCAT("UPDATE `", TABLE_NAME, "` SET `", COLUMN_NAME, "`=REPLACE(`", COLUMN_NAME, "`, 'findUrl.com', 'replaceUrl.com');");
PREPARE statement FROM @SQL_TEXT;
EXECUTE statement;
DEALLOCATE PREPARE statement;
END IF;
END WHILE;
CLOSE tables;
END
ストアド プロシージャinformation_schema
は、現在のデータベースのすべてのテーブル/列に対してデータベースを反復処理します。このリストをUPDATE
使用して、元の回答に似たクエリを作成し、実行します。クエリの列の種類を制限する場合、または置換が行われる正確な列名がわかっている場合、これはより効率的になる可能性がありSELECT
ます (ただし、検索 + 置換を行う必要はないと思います.