2014-01-21 14 views
0

我有一個67000行的文本文件,每一行都是一個更新語句。是否有可能一次運行多個在mysql中用分號分隔的更新語句?

是否有可能一次執行所有更新語句?或者我可以使用什麼工具在MySQL中執行此操作?

正在更新的數據或列更改大部分。

以下是一些有關更新的示例。

UPDATE emailTbl SET CC="", BCC="", recipient_new="[email protected]" WHERE docid=0000000139;   
UPDATE emailTbl SET CC="", BCC="", recipient_new="[email protected]" WHERE docid=0000000362;   
UPDATE emailTbl SET sender_new="[email protected]", CC="", BCC="", recipient_new="[email protected]" WHERE docid=0000004313;   
+1

如果您確定文本文件中沒有語法錯誤,只需從命令行運行「mysql mydatabase

+0

語法是正確的,因爲如果我一次運行一個語句他們的工作。對於不太瞭解MySQL,我感到非常抱歉。我在這方面有點新鮮。如果你能指點我一個樣本,我真的很想。 – user2066533

+1

您是否可以這樣做取決於客戶端。如果你使用mysql命令行客戶端,那麼你可以執行前面的註釋中提到的倍數。如果您在編程語言中使用某些API,則許多API不支持多個分隔語句。 –

回答

0

你不會說你是使用InnoDB還是使用MyISAM表。它很重要,因爲InnoDB支持事務。通過在文本文件中添加偶爾的事務處理行,您可以在InnoDB上運行得更快。

該文件應該最好是這樣的:

START TRANSACTION; 
    UPDATE emailTbl SET CC="", BCC="", recipient_new="[email protected]" WHERE docid=0000000139; 
    UPDATE emailTbl SET blah blah blah; 
    UPDATE emailTbl SET blah blah blah; 
    ...97 more UPDATE lines ... 
    COMMIT; 
    START TRANSACTION; 
    UPDATE emailTbl SET blah blah blah; 
    ...99 more UPDATE lines ... 
    COMMIT; 
    START TRANSACTION; 
    UPDATE emailTbl SET blah blah blah; 
    ...99 more UPDATE lines ... 
    COMMIT; 

換句話說,與START TRANSACTION;開始你的文件。用COMMIT;結束。每百行左右插入這兩行來完成一個事務並開始另一行。

COMMIT; 
    START TRANSACTION; 

如果你不這樣做,你的命令行mysql客戶端將在自動提交模式下運行,這將使其花費更長的時間通過所有這些更新咀嚼;它會爲每一行做一次提交。

如果您在運行mysql時關閉了自動提交模式,它將嘗試在單個事務中執行全部67個千字節。你可以填寫你的服務器的提交緩衝區RAM。

+0

它給了我以下錯誤mysql> dwdata user2066533

+0

謝謝大家的幫助。我遵循你的指示,完成了一切! – user2066533

1

這是使用mysql命令行工具支持的。

該語句按順序執行。我不知道任何可以並行執行此操作的工具,我也不確定這是個好主意。

+1

這是一個非常糟糕的主意,例如,如果有可能一些更新將應用於腳本中早些時候更新的行。 –

相關問題