2010-12-03 20 views
3

私はかなり良いシステム管理者であり、問​​題なしでmysqlサーバを管理することができます。私の問題は、実際にSQLをコード化することにあります。特に、SQLをコード化することは、夜間スクリプトで自動化するのが安全だと感じています。それは素晴らしいスタックオーバーフローの人が入っているところです。sqlの検索と置換

私は現在、私の開発用のワードプレスサイトを私の開発サーバーに同期させています。私が生産のコピーになるようにmysqlを更新した直後に、約2000個の文字列を見つけて置き換える必要があります。

私が行う必要があるのは、SQLを実行して、http://DrunkOnJudgement.comからhttp://dev.DrunkOnJudgement.comまでの任意のテーブルの任意の場所を検索して置き換える方法です。

オビ・ワン・ケノービスあなたの私の唯一の希望を助けてください。

+0

修正する必要のある列/テーブルの数は、テキスト内またはフィールドの値全体として発生します。 – tobyodavies

答えて

4

;

これにより、特定の列で探しているテキストを、周囲のテキストを変更せずに、そのテキストに置き換えることができます。

ので、たとえばあなただけのような何かにそれを短縮することができます:あなたが唯一置き換えるように置き換える(column_nameに、「dev.DrunkOnJudgment.com」、「DrunkOnJudgment.com」)

また、where句を指定することができます

[OK]を「%dev.DrunkOnJudgement.com%」のようなcolumn_nameには、全体のDBを検索し、基本的に、すべてのテーブルのすべての列のためにこのような何かを行うには

:ので、このような何かを、そのテキストを含むアイテム。それはそれがないテキストが見つからない場合には、出力データベース内およびので、各列とテーブルの上のようなSQL文はあなたが文を置き換える使用しています

SELECT Concat('UPDATE ', TABLE_NAME, ' SET ', COLUMN_NAME, ' = REPLACE(', COLUMN_NAME, ',''dev.DrunkOnJudgment.com'',''DrunkOnJudgment.com'')', ' WHERE ', COLUMN_NAME, ' like ''%dev.DrunkOnJudgment.com%''') FROM INFORMATION_SCHEMA.COLUMNS 

:あなたは、このようなステートメントを使用することができます何も置き換えないと、実際にそのテキストを含むレコードのみを更新することができます。

だから、このカーソルを使用し自動化するために、私は次のコードをテストしていませんが、それはこのようなものになります。私は手遅れだと思い、あなたの製品のライフサイクルにおけるこの時点で

DECLARE done BOOLEAN DEFAULT 0; 
    DECLARE sql VARCHAR(2000); 

    DECLARE cmds CURSOR 
    FOR 
    SELECT Concat('UPDATE ', TABLE_NAME, ' SET ', COLUMN_NAME, ' = REPLACE(', COLUMN_NAME, ',''dev.DrunkOnJudgment.com'',''DrunkOnJudgment.com'')', ' WHERE ', COLUMN_NAME, ' like ''%dev.DrunkOnJudgment.com%''') FROM INFORMATION_SCHEMA.COLUMN; 

    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 
    OPEN cmds; 
    REPEAT 
     FETCH cmds INTO sql; 
     PREPARE stmt FROM sql; 
     EXECUTE stmt; 
     DROP PREPARE stmt; 
    UNTIL done END REPEAT; 
    CLOSE cmds; 
+0

この答えは、その表を含むことができるその表内のすべての列の各表について繰り返すことができます。 – DGH

+0

問題は、すべてのテーブル名またはカラムがわからないことです。同期コードを更新しなくても更新が必要なものがあるプラグインを追加することがあります。今のところ問題があります。サムネイル画像にリンクしている特定のプラグイン、1000のemとハードコードではなく、$ siteurlを使用します。パスかそれが何であっても。私はスクリプトを使用して各テーブルの各列を解析することができたと思います。 –

+0

ああ、まあまあ、そのようなことをするには、INFORMATION_SCHEMAテーブルでカーソル内の各テーブルとカラムをループする必要があります。私が本当に素早く何かを鞭打つことができるかどうかを見てみましょう。 –

4

これは、where句の更新文と同じくらい簡単ですか?

あなたはこの

更新TABLE_NAME セットCOLUMN_NAME =置き換える(COLUMN_NAMEを、 'http://dev.DrunkOnJudgement.com'、 'http://DrunkOnJudgement.com')のような何かをしたい

update myTable 
set myCol = 'http://dev.DrunkOnJudgement.com' 
where myCol = 'http://DrunkOnJudgement.com' 
+0

私は真剣に彼がカラムにURLを保存しようとしているのではないかと疑問に思います。http://example.com/some-page ... – tobyodavies

+0

@tobyodavies - 私は同意しますが、それはOPです彼は彼の目的に合った答えを見つけたようだ。私は完全に彼の元の質問をすべての列について、テーブルのビットのいずれかを完全に消化していない...問題のレッスンと質問ダイジェストのようだ! – Chase

+0

私は最高の答えとしてあなたを選んでいませんでしたが。これも非常に役に立ちました。 –

0

をこの問題を完全に解決する解決策を提案することですか? たとえば、絶対URLを使用しないか、または実行時に評価される変数にURLを置き換えますか?

+0

ええ、ちょうどよくコード化されていないワードプレスのプラグイン。私は、$ siteurlの代わりに絶対パスを使用するという事実以外は、うまく機能するので、コード化されていないと言ってはいけません。 $パス –