2015-10-08 53 views
1

我讀過一個JOIN語句可以連接兩個表進行更新,並且我很難整理我的大腦。如何使用MYSQL服務器中的單個JOIN語句更新兩個表?

我有7個表,並且所有不同的語言都有不同的字符集。 我需要更新和插入3列..

須藤命名

  • table1EN
  • table1DE
  • table1ZH
  • table1PT
  • table1FR
  • table1ES
  • table1RU

的表是100%相同的結構..

做一個更新,現在我用這個查詢

UPDATE `Table1EN` SET `Details`= 'String Value', `Name` = 'String Name', 
`Info`= 1 WHERE `ID` = 1; 

,然後重複5000次,改變table1EN到Table 1 **,並重新運行

有沒有辦法簡化這個?

UPDATE `Table1EN`,`Table1ZH`,`Table1DE`,`Table1FR`,`Table1RU`,`Table1ES`,`Table1PT` 
SET `Details`= 'String Value', `Name` = 'String Name', `Info`= 1 WHERE `ID` = 1; 

運行此查詢將返回模糊的名稱詳細信息,名稱和信息。 使用加入聲明似乎鎖定了服務器..

我的問題是我如何運行多表更新查詢,其中所有值都是相同的沒有更改?不鎖定服務器?沒有模糊的名稱錯誤?最後,在重命名錶後,不必在5000的卡盤中運行查詢?

UPDATE1:

正如阿瑟所指出的下方,我不包括實際這裏連接查詢。

UPDATE table1EN 
    INNER JOIN table1ZH USING (ID) 
    INNER JOIN table1DE USING (ID) 
    INNER JOIN table1FR USING (ID) 
    INNER JOIN table1PT USING (ID) 
    INNER JOIN table1ES USING (ID) 
    INNER JOIN table1RU USING (ID) 
    SET table1EN.Info = 1, table1EN.Details ='String Value', 
    table1ZH.Info = 1, table1ZH.Details ='String Value', 
    table1DE.Info = 1, table1DE.Details ='String Value', 
    table1FR.Info = 1, table1FR.Details ='String Value', 
    table1ES.Info = 1, table1ES.Details ='String Value', 
    table1RU.Info = 1, table1RU.Details ='String Value', 
    table1PT.Info = 1, table1PT.Details ='String Value' 
    WHERE table1EN.ID = 1; 

我現在張貼,希望簡化它崩潰隨時我嘗試在同一時間有5000個不同的查詢的運行它停止服務器。

我試圖減少這種基於什麼我讀

set table1EN.Info = 1, table1EN.Details ='String Value', 
    table1ZH.Info=table1EN.Info, 
    table1DE.Info=table1EN.Info, 
    table1FR.Info=table1EN.Info 
    etc ........ 

然而,這似乎導致更多的服務器滯後和崩潰女巫我希望..

+0

http://stackoverflow.com/questions/2044467/how-to-update-two-tables-in-one-statement-in-sql-server-2005或http://stackoverflow.com/questions/4361774/mysql-update-multiple-tables-with-one-query for mysql or ... http://stackoverflow.com/questions/8851974/updating-multiple-tables-in-a-single-sql-statement using inner join句法。或通過工會更新所有視圖... https://dev.mysql.com/worklog/task/?id=3701 – xQbert

+0

拳頭鏈接統計SQL不能做到這一點,第二個是MySQL和更接近,但劑量不是解釋如何在那裏使用單個名稱,例如我將不得不在查詢中重複每個表的詳細信息名稱和信息的值。 – CKY

+0

最後一個說明使用union ALL語句創建視圖並通過視圖進行更新。 – xQbert

回答

1

首先,當你做的更新連接,你沒有包括任何連接條件..所以,將嘗試做一個笛卡爾每個表的產品:

#rows = #rows_table1EN * #rows_table1ZH * ... * #rows_table1PT 

您應該爲每個表加入table1EN.id = table1xx.id

接下來的問題是,你將不得不引用你想改變的每一列。這將導致:

SET table1EN.detail = 'String Value', 
    table1ZH.detail = 'String Value' 
    ... 
    table1PT.detail = 'String Value' 

這可以通過動態構建語句來完成,但這是相當可怕的。

這一切都讓我質疑你的數據庫結構。你有沒有考慮使用一個帶有額外語言欄的表格;要麼是兩個字母標識符 (OKish),要麼是一個語言表的外鍵(更好)?

+0

我確實考慮過這一點,但遇到了BIG5衝突,無論col上的字符集是否會採用big5字符編碼,即使在使用UTF-8時也會返回帶有中文編碼的德文字母 – CKY

+0

沒有辦法縮短設置爲單個語句? – CKY

+0

但是你爲什麼要將7個表全部更新爲相同的值?你能不能把它放在一張桌子上,即使它只是'info','id'和'detail',並把其他桌子掛起來?我可能會首先嚐試解決語言和碰撞問題,但是會考慮在每種語言的表格上對每個表格考慮一個表格。 – Arth

1

不知....

Update (
Select ID, details, name, info, 'table1EN' src FROM table1EN UNION ALL 
Select ID, details, name, info, 'table1ZH'  FROM table1ZH UNION ALL 
Select ID, details, name, info, 'table1DE'  FROM table1DE UNION ALL 
Select ID, details, name, info, 'table1RU'  FROM table1RU UNION ALL 
Select ID, details, name, info, 'table1FR'  FROM table1FR UNION ALL 
Select ID, details, name, info, 'table1ES'  FROM table1ES UNION ALL 
Select ID, details, name, info, 'table1PT'  FROM table1PT) b 
set `details` = 'String value', 
    `Name` = 'String Name', 
    `Info` = 1 
where ID=1 

會...基於https://dev.mysql.com/worklog/task/?id=3701

ID和src工作將是一個複合鍵。

+0

,除非我誤解這是它返回的錯誤.. #1288 - UPDATE的目標表b不可更新 – CKY

+0

不幸的是,我無法通過視圖來實現它的工作:( – xQbert

+0

這是值得一試的。就像我說的,我願意嘗試任何方法來節省幾個小時的時間.. – CKY

相關問題