提前感谢您的帮助!我有一个名为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
...但我收到此错误: 错误:超出锁定等待超时;尝试重新启动交易
任何帮助将不胜感激:) 凯西
答案 0 :(得分:0)
我已经测试了你的SQL代码并且它工作得很完美,所以你得到的错误是由于一些内部的怪异(有很多可能的原因导致为什么会发生这种情况,但我试图避免技术性)。因此,让我们看看您的错误的一些可能的解决方案:
innodb_lock_wait_timeout = ...
取消注释这些,然后提高它们的值(大约300左右),最后重新启动MySQL服务器;如果你想知道为什么要取消注释所有这些,好吧,似乎只有其中一个会做这个技巧,但你不知道哪一个因为它取决于服务器配置。
答案 1 :(得分:0)
交叉连接可以创建超时。
我会基于....创建一个临时查找表。
SELECT BASEITEMID, DESC FROM INVENTORY WHERE DESC != ""
然后创建一个更新语句,在SET子句中有一个子查询,用于填充缺少的信息。