你想要做这样的事
更新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