0

言語で実際にスクリプトを作成する必要なく、MySQL でデータベース全体の検索置換を行う最良の方法は何ですか (つまり、それが必要な場合はそうします)。

基本的に、Drupal でサイト名を別のサイト名 (アップグレード用に開発サーバーをセットアップしています) に置き換えたいと考えています。

私の考えでは、データベース内のすべてのリンクを変更する必要があります。これを行うには PHPMyAdmin を使用したいと思いますが、コマンド ラインも使用できます。

4

1 に答える 1

1

次のようなテーブル設定があると仮定します。

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ます (ただし、検索 + 置換を行う必要はないと思います.

于 2012-07-26T14:28:09.783 に答える