2009-09-17 89 views
2

我需要更換20餘名000用新的名稱我創建給出的代碼ID。有沒有一種更新SQL中很多記錄的快速方法?

例如:我必須用「cat」更新包含「dog」(CodeID爲1)的所有行,並將包含「horse」(CodeID爲2)的所有行更新爲「bird 」等

1 SQL語句:UPDATE animalTable SET cDescription = 「貓」 WHERE CodeID = 1

第二SQL語句:UPDATE animalTable SET cDescription = 「鳥」 WHERE CodeID = 2點

這些聲明工作,但我需要一個更快的方式來做到這一點,因爲我有超過20 000個名字。

預先感謝您。

+0

以什麼形式列出CodeId | OldName | NewName? – Benjol 2009-09-17 07:37:49

+0

創建一個存儲過程。 – adatapost 2009-09-17 07:38:04

+0

我對理解這個問題有點困難。你能否爲你的桌子提供模式或嘗試重新修改一下? – Evernoob 2009-09-17 07:39:38

回答

6

。這是你能做到的最快方式。

或者你想在一個命令更新所有記錄?

,你可以做一個加入一個更新(固定語法......還沒有使用這一個在一段時間)

UPDATE animalTable 
INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID 
SET animalTable.cDescription = CodeTable.Description_1; 

另一種選擇是分裂更新爲較小的批次,這將減少時間表被鎖定...但更新的總時間將花費更長的時間(它只是對預分類性能的改進)您可以通過僅更新每個批次中的特定ID範圍來實現這一點。你

也可以在一個單獨的表數據。由於數據未規範化。將它移開,使其更加標準化。

+0

非常感謝。我不得不編輯的幾件事情: UPDATE animalTable INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID SET animalTable.cDescription = CodeTable.Description_1; 再次非常感謝 – sami 2009-09-18 10:13:06

+0

是否有辦法在UPDATE期間禁用表鎖定和回滾功能?也許禁用整個數據庫的所有額外功能?因爲這將是最快的 – batman 2018-03-08 19:56:18

+0

不,這些功能屬於SQL DB。您可以通過確保每批更新的批處理大小低於5000行來限制表鎖定,因此不會發生鎖升級。另外,對於SQL的最新版本,您可以查看「延遲的持久性」功能,我不建議用於生產(但它可以在SEVERE限制下爲您購買一些性能...請檢查TechNet) – 2018-03-10 22:40:18

1

你可以使用一個CASE語句來更新它

UPDATE animaltable SET cDescription = CASE WHEN代碼ID 1 THEN '貓' WHEN 2 THEN '鳥' .... END

3

您可能希望創建一個臨時表,保存翻譯值並基於此進行更新。

例如:

create table #TRANSLATIONS 
(
    from varchar(32), 
    to  varchar(32) 
) 

然後,將平移值:

insert into #TRANSLATIONS (from,to) values ('cat','dog') 

最後,更新基礎上認爲:

update MYTABLE 
set myvalue = t.to 
where myvalue = t.from 
from MYTABLE m, 
     #TRANSLATIONS t 

(未經測試,關閉頂部我頭)。

+0

您需要爲這些兩張桌我覺得... – codeulike 2009-09-17 07:52:36

+0

就像我說的 - 沒有經過測試,離開了我的頭頂。 :-)'where'子句是否實現了連接? – Andrew 2009-09-17 09:53:43

1

Supposind你有這樣的文件:

1,cat 
2,bird 
... 

我會寫一個腳本讀取該文件,並執行每一行的更新。

在PHP:

$f = fopen("file.csv","r") 
while($row = fgetcsv($f, 1024)) { 
    $sql = "update animalTable set cDescription = '".$row[1]."' where CodeID = ".$row[0]; 
    mysql_query($sql); 
} 
fclose($f); 
+0

括號內的1024是什麼? – sami 2009-09-17 08:05:33

+0

取自文檔(http://us.php.net/fgetcsv): 必須大於在CSV文件中找到的最長行(以字符爲單位)(允許尾部行尾字符)。它在PHP 5中成爲可選項。省略此參數(或者在PHP 5.0.4及更高版本中將其設置爲0),最大行長度不受限制,這稍微慢一些。 – Keeper 2009-09-17 08:12:16

+0

我將如何執行此腳本?對不起,我是mySQL的新手。 – sami 2009-09-17 08:16:02

0

你可以做,以加快它是隻更新不已經有您要分配的值的記錄。

UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1 AND cDescription != "cat" 

該方法使命令只更新那些不是'貓'的記錄。

聲明:我討厭貓。

相關問題