如何使用MySQL从一个表行中获取数据,并将其复制到具有相同项目编号的其他行

时间:2011-10-31 18:58:03

标签: mysql

提前感谢您的帮助!我有一个名为ItemStoreDisplayName的表,如下所示:

IsParentItem   Size BaseItemID  ConfirmationStoreDisplayName
yes                 10045       Los Angeles Dodgers Authentic Home Jersey
               S    10045       
               M    10045       
               L    10045       
               XL   10045       
yes                 77245       San Francisco Giants 5950 Game Cap
               S    77245       
               M    77245       
               L    77245       
               XL   77245       

...等

我需要做的是从“IsParentItem ='yes'的项中获取ConfirmationStoreDisplayName,并将该数据复制到具有匹配的BaseItemID的其他行中。所以当更新完成后,我希望它看起来像这样:

IsParentItem   Size BaseItemID  ConfirmationStoreDisplayName
yes                 10045       Los Angeles Dodgers Authentic Home Jersey
               S    10045       Los Angeles Dodgers Authentic Home Jersey
               M    10045       Los Angeles Dodgers Authentic Home Jersey
               L    10045       Los Angeles Dodgers Authentic Home Jersey
               XL   10045       Los Angeles Dodgers Authentic Home Jersey
yes                 77245       San Francisco Giants 5950 Game Cap
               S    77245       San Francisco Giants 5950 Game Cap
               M    77245       San Francisco Giants 5950 Game Cap
               L    77245       San Francisco Giants 5950 Game Cap
               XL   77245       San Francisco Giants 5950 Game Cap

我意识到这对于数据库来说是一个糟糕的表结构,但这是一次性更新,我将通过csv import导入到不同的系统,这需要这样的数据。如果我需要将“父”项与子项分开并使用2个单独的表来实现,我可以这样做。

我试过了:

 UPDATE
 ItemStoreDisplayName AS Child
 CROSS JOIN (
 SELECT DISTINCT 
    BaseItemID, ConfirmationStoreDisplayName, IsParentItem 
  FROM 
    ItemStoreDisplayName
  WHERE 
    IsParentItem='yes'
) AS Parent
USING (BaseItemID)
SET
  Child.ConfirmationStoreDisplayName = Parent.ConfirmationStoreDisplayName

...但我收到此错误: 错误:超出锁定等待超时;尝试重新启动交易

任何帮助将不胜感激:) 凯西

2 个答案:

答案 0 :(得分:0)

我已经测试了你的SQL代码并且它工作得很完美,所以你得到的错误是由于一些内部的怪异(有很多可能的原因导致为什么会发生这种情况,但我试图避免技术性)。因此,让我们看看您的错误的一些可能的解决方案:

  • 可能的解决方法是简单地重新启动MySQL服务器;
  • 如果您所谈论的表格包含大量数据,请转到 /etc/my.cnf 配置文件,然后找到包含以下内容的行:

    innodb_lock_wait_timeout = ...
    net_read_timeout = ...
    net_write_timeout = ...
    table_lock_wait_timeout = ...

取消注释这些,然后提高它们的值(大约300左右),最后重新启动MySQL服务器;如果你想知道为什么要取消注释所有这些,好吧,似乎只有其中一个会做这个技巧,但你不知道哪一个因为它取决于服务器配置。

  • 最后一个解决方案(可能有点激进)将将您的表删除到备份文件,重新启动MySQL服务器,然后从该备份恢复

答案 1 :(得分:0)

交叉连接可以创建超时。

我会基于....创建一个临时查找表。

SELECT BASEITEMID, DESC FROM INVENTORY WHERE DESC != ""

然后创建一个更新语句,在SET子句中有一个子查询,用于填充缺少的信息。