2013-01-09 21 views
5

我有一個Moodle安裝,我遷移到另一臺服務器,我需要更改幾個對舊域的引用。如何在所有行中的所有字段中的所有表中替換MySQL數據庫中的字符串?

如何在給定數據庫中替換MySQL中另一個字符串的字符串搜索所有表,所有字段和所有行?

我不需要更改字段名稱,只是值。


相關:How can I use mySQL replace() to replace strings in multiple records?

但標記爲答案解決方案意味着我強類型的表名,我需要火到整個數據庫這一點,在運行該腳本N次的每個表沒有手動工作。

+0

你寧願創建一個新表,然後......刪除那個舊的......因爲你在說所有行中所有字段中的所有表......這實際上是一個entier數據庫不是嗎? – bonCodigo

+0

我會嘗試編寫一個查詢,生成腳本,它會做一個表的查詢... – ppeterka

+0

@ppeterka:元,我喜歡它。但我希望MySQL有內置的東西。現在誰知道,Postgres擁有數組字段等等! – sergserg

回答

2

我會考慮查詢INFORMATION_SCHEMA.COLUMNS並動態搜索列和表。試着像在數據庫創建所有的列和表的光標:

DECLARE col_names CURSOR FOR 
SELECT column_name, table_name 
FROM INFORMATION_SCHEMA.COLUMNS 

然後通過每個在每個表的列的迭代和運行動態/準備的SQL更新,其中串存在。

這裏有幾個不錯的職位,讓你在正確的方向:

https://stackoverflow.com/a/4951354/1073631

https://stackoverflow.com/a/5728155/1073631

7

這看起來有點......醜陋。但也許只需將數據庫轉儲到sql/txt文件,替換所有字符串並使用修改的轉儲重新創建數據庫。

+0

我有這種作爲最後的手段,做一個mysqldump和導入將需要幾個小時,因爲數據庫大約170GB大。 – sergserg

+0

你知道Linux上的什麼命令,我應該考慮直接從終端替換.sql文件中的文本嗎? – sergserg

+0

是什麼讓你認爲使用內置函數做得更快?全文搜索就是它使用的任何工具。 我敢說在文本文件上使用linux sed將比任何內置工具更快。 //編輯:你在我寫完之後發佈 - 'sed'就是你要找的東西 – Dariusz

2

您可以運行下面的代碼來創建所有你需要運行UDPATE聲明做你的更新。它會更新數據庫中每個表中的每個字段。您需要運行此代碼,並複製結果並運行它們。

警告 - 一定要在測試環境中進行測試。你不想要任何不愉快的意外。根據需要修改。

SELECT concat('UPDATE ', TABLE_NAME, ' SET ', COLUMN_NAME, ' = REPLACE(', COLUMN_NAME, ', ''STRING_TO_REPLACE'', ''REPLACE_STRING'')') 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE TABLE_SCHEMA = 'YOUR_DATABASE_NAME' 
     AND DATA_TYPE IN ('char', 'varchar') 
; 

我只限於char和varchar字段。您可能需要添加其他數據類型。

+0

剛剛更新,我錯過了一個右括號。 – Tom

相關問題