2010-12-03 150 views
3

所以我一個很好的系統管理員,可以沒有問題管理mysql服務器。我的問題是實際編碼sql,更具體地說,編碼sql我覺得在夜間腳本中自動安全。多數民衆贊成在那裏你真棒堆棧溢出傢伙進來。sql中查找和替換

目前,我有我的生產WordPress站點同步到我的開發服務器,所以我們必須儘量靠近住了推到生產環境之前測試上。在更新mysql成爲生產副本後,我需要查找並替換大約2,000個字符串。

我所需要做的就是找到一種方法來執行SQL查找並替換http://DrunkOnJudgement.comhttp://dev.DrunkOnJudgement.com任何表中的任何位置。

幫助我歐比旺Kenobis你我唯一的希望。

+0

多少列/表需要進行修改,而這確實發生在文本或作爲現場的全部價值。 – tobyodavies 2010-12-03 05:14:17

回答

4

你想要做這樣的事

更新table_name的 集列名=替換(列名, 'http://dev.DrunkOnJudgement.com', 'http://DrunkOnJudgement.com') ;

這將確保您只需替換正在與文本的特定列找你希望它是文本,而不改變它周圍的任何文字。

因此,例如,你可以只縮短到類似:更換(列名,「dev.DrunkOnJudgment.com」,「DrunkOnJudgment.com」)

你也可以指定一個where子句,以便只更換包含該文本所以像這樣的項目:

其中LIKE「%dev.DrunkOnJudgement.com%」

行做這樣的事情的所有表中的所有列,列名基本搜索整個數據庫。你可以用這樣的語句:

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 

它會輸出像上面的在數據庫,因爲每一列和表的SQL語句,你使用的是REPLACE語句,如果它沒有找到它的文本不取代任何東西它也確保您只更新實際包含該文本的記錄。

所以自動完成這個你可以使用一個光標,我沒有測試過下面的代碼,但它會是這個樣子:

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; 
4

這是與一個WHERE子句的UPDATE語句一樣簡單?

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

我真誠地懷疑他是否會在列中存儲_just_ url,至少它會是http://example.com/some-page ... – tobyodavies 2010-12-03 05:12:39

+0

@tobyodavies - 我同意,但這就是OP問,他似乎找到了一個適合他的目的的答案。我沒有完全消化他關於任何專欄的原始問題,也沒有任何一個表格......似乎是寫作和提問消化的課程! – Chase 2010-12-04 01:48:18

+0

即使我沒有選擇你作爲最佳答案。這也非常有幫助。 – 2010-12-07 23:34:27

0

在您的產品的生命週期這一點上,我想這是爲時已晚建議制定一個完全解決這個問題的解決方案? 例如,不使用絕對URL或用運行時評估的某些變量替換url?