你想要做這樣的事
更新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;
多少列/表需要進行修改,而這確實發生在文本或作爲現場的全部價值。 – tobyodavies 2010-12-03 05:14:17