我已经读过A JOIN语句可以连接两个表进行更新,而且我很难扭曲我的大脑......
我有7张桌子,所有不同的语言都是不同的字符集。 我需要更新并插入3列..
sudo命名
这些表是100%相同的结构..
现在进行更新我使用此查询
UPDATE `Table1EN` SET `Details`= 'String Value', `Name` = 'String Name',
`Info`= 1 WHERE `ID` = 1;
然后重复5000次并将table1EN更改为table1 **并重新运行
有没有办法将其简化为?
UPDATE `Table1EN`,`Table1ZH`,`Table1DE`,`Table1FR`,`Table1RU`,`Table1ES`,`Table1PT`
SET `Details`= 'String Value', `Name` = 'String Name', `Info`= 1 WHERE `ID` = 1;
运行此查询会返回不明确的名称详细信息,名称和信息。 使用join语句似乎会锁定服务器..
我的问题是如何运行多表更新查询,其中所有值都相同,没有任何变化?没有锁定服务器?没有含糊不清的名称错误?最后,在重命名表后,不必在chucks 5000中运行查询?
UPDATE1:
正如Arth指出的那样,我在这里没有包含实际的JOIN查询。
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 :(得分:1)
当您执行UPDATE JOIN时,首先关闭,您没有包含任何JOIN条件..所以这将尝试为每个表做一个笛卡尔积:
#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)或语言表的外键(更好)?
答案 1 :(得分: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将是一个复合键。