所以我是一个非常好的系统管理员,可以毫无问题地管理mysql服务器。我的问题是实际编码sql,更具体地说是编码sql我觉得在夜间脚本中自动化是安全的。那就是那些令人敬畏的堆栈溢出人员进来的地方。
我目前将我的生产wordpress网站同步到我的开发服务器,因此在推送到生产之前我们已经接近生存用于测试。在我将mysql更新为生产副本之后,我需要找到并替换大约2,000个字符串。
我需要做的就是找到一种方法来执行SQL来查找http://DrunkOnJudgement.com并将http://dev.DrunkOnJudgement.com替换为{{3}}任何表中的任何位置。
帮助我Obi wan Kenobis你唯一的希望。
答案 0 :(得分:4)
这是否与带有where子句的更新语句一样简单?
update myTable
set myCol = 'http://dev.DrunkOnJudgement.com'
where myCol = 'http://DrunkOnJudgement.com'
答案 1 :(得分:4)
你想做这样的事情
更新table_name set column_name = replace(column_name,'http://dev.DrunkOnJudgement.com','http://DrunkOnJudgement.com');
这将确保您只需将特定列中要查找的文本替换为您想要的文本而不更改其周围的任何文本。
所以例如你可以把它缩短为:replace(column_name,'dev.DrunkOnJudgment.com','DrunkOnJudgment.com')
您还可以指定where子句,以便只替换包含该文本的项目,如下所示:
其中column_name类似'%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;
答案 2 :(得分:0)
在您的产品生命周期的这一点上,我想建议制定完全解决这个问题的解决方案为时已晚? 例如,不使用绝对URL,或者将url替换为在运行时评估的某个变量?