2010-12-03 121 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?