2012-11-29 81 views
0

我有两张表,我试图从一个到另一个插入数据,我已经能够找到一些如何在网上完成的例子,问题是这些例子大多依赖于相同的两者之间的表结构...你看我试图将一些数据从一个表插入另一个具有完全不同结构的表中。从一个表格插入数据到另一个表格?

我试图从名为'catalog_product_entity_media_gallery'的表中插入数据到名为'catalog_product_entity_varchar'的表中。下面是它们的结构

的“catalog_product_entity_varchar”的简单描述如下所示:

value_id | entity_type_id | attribute_id | store_id  | entity_id | value 
    PK    INT    INT   INT    INT  VARCHAR 

和“catalog_product_entity_media_gallery”表如下所示:

value_id | attribute_id | entity_id | value 
    PK    INT    INT   VARCHAR 

我需要插入实体并将catalog_product_entity_media_gallery中的列值更改为catalog_product_entity_varchar。但是,正如你所看到的结构是完全不同的。

我试图使用的查询是如下

USE magento_db; 
INSERT INTO catalog_product_entity_varchar(entity_type_id, attribute_id, store_id, entity_id, value) 

SELECT 
4, 
74, 
0, 
catalog_product_entity_media_gallery.entity_id, 
catalog_product_entity_media_gallery.value 

FROM catalog_product_entity_media_gallery; 

我只需要ENTITY_ID和价值media_gallery和其他值都是一样的,我试图做到这一点使用上述但这只是挂在MySQL(没有错误)

我认为这是由于我试图从catalog_product_entity_media_gallery选择4,74和0,但我不是100%确定(道歉,我是一个事实一位新手用MySQL)

有人可以指点我在正确的方向?有什么办法可以插入媒体表中的一些数据,同时插入一些列的静态值? (我希望这一切才有意义)

+1

您的选择返回多少行?在查询运行时,您可以打开另一个mysql命令提示符并运行'show processlist'来查看mysql正在执行的操作。 YOu也可以做'解释',看看你是否需要一个索引来加快速度。请参阅https://dev.mysql.com/doc/refman/5.0/en/explain.html –

+0

您能描述一下您试图从应用程序级别完成的任务吗? – benmarks

回答

1

查询语法正常。

但是,catalog_product_entity_varchar表中的唯一键和外键可能存在问题,因此无法插入数据。此外,查询可能正在等待其他查询完成(如果您的查询只是更大场景的一部分),所以这是锁定问题。最有可能的是第一种情况。

目前,该问题缺少重要的细节:

  • MySQL客户端/编程代码,用于执行查询。因此,我们 无法看到全部案例并正确重现
  • 您执行的场景。即无论您是在网络请求期间在某个 模块中的Magento应用程序中执行此操作。或者是否有脚本中的其他疑问, 一些开交易,其他人访问DB服务器等基于最可能的假设,你只是看不到的独特/外键的实际错误

,您可以尝试以下查询。


1)唯一索引失败。 试试这个:

USE magento_db; 
INSERT INTO catalog_product_entity_varchar(entity_type_id, attribute_id, store_id, entity_id, value) 

SELECT 
    4 as etid, 
    74 as aid, 
    0 as sid, 
    catalog_product_entity_media_gallery.entity_id as eid, 
    catalog_product_entity_media_gallery.value as val 
FROM 
    catalog_product_entity_media_gallery 
GROUP BY 
    eid, aid, sid; 

有一个巨大的可能性,您插入非唯一条目,因为catalog_product_entity_media_gallery可以容纳多个条目为同一产品,而catalog_product_entity_varchar不能。如果上面的查询成功完成,那么问题是真正的唯一键。在这种情况下,您必须重新验证您想实现的目标,因为最初的目标(而不是查询本身)是错误的。


2)错误外键(非现有属性74)

试试这个(更换ATTRIBUTE_CODE和ATTRIBUTE_ENTITY_TYPE_ID与您需要的值,例如 '姓' 和6):

USE magento_db; 
INSERT INTO catalog_product_entity_varchar(entity_type_id, attribute_id, store_id, entity_id, value) 
SELECT 
    4 as etid, 
    eav_attribute.attribute_id as aid, 
    0 as sid, 
    gallery.entity_id as eid, 
    gallery.value as val 
FROM 
    catalog_product_entity_media_gallery AS gallery 
INNER JOIN 
    eav_attribute 
    ON 
     eav_attribute.attribute_code = '<ATTRIBUTE_CODE>' 
     AND eav_attribute.entity_type_id = <ATTRIBUTE_ENTITY_TYPE_ID> 
GROUP BY 
    eid, aid, sid; 

如果它成功执行AND

  • 某些行被添加到catalog_product_entity_varchar - 然后它似乎,74被选为您所需属性的错误ID,因此外键catalog_product_entity_varchar不允许您插入记录。
  • 没有行被添加到catalog_product_entity_varchar - 那么看起来,你错误的属性ID,属性代码和实体类型。重新检查一下,你把ATTRIBUTE_CODE和ATTRIBUTE_ENTITY_TYPE_ID放在哪里。


如果两个查询仍然挂起 - 那么您的MySQL客户端或服务器或执行方案有问题。



注意:你的初始查询可能会使您的特定情况下感觉,但有些问题是信号的东西可能是错的与你的做法,因为:

  1. 您采用直接ids号码。但是对于不同的安装和Magento版本,id是不同的。预计会使用更稳定的值,例如第二个查询中的属性代码,通过该值可以提取实际的属性ID。
  2. 将数据从存储器catalog_product_entity_media_gallery(可以存储多个相同产品的条目)复制到存储器catalog_product_entity_varchar,该存储器只能存储产品的一个条目。这意味着,您无法以这种方式复制所有数据。可能你的查询并不能反映你想达到的目标。
  3. 插入到catalog_product_entity_varchar的实体类型标识与属性标识无关。而在Magento中,这些东西是深深联系的。将错误的实体类型标识放置在表中会使Magento行为不正确,或者根本不会注意到您的更改。
+0

感谢您提供详细和全面的答案,在您发布此消息之前不久,我最终从另一个版本的网站恢复数据库,显然已修复此问题。 – Sean

+0

无论我把它标记为正确的,因为它教会了我很多,我感到很难在原始问题中添加足够的细节!你指出的一些事情确实是我应该注意到的。再次感谢您的答案:) – Sean

+1

不客气:)与Magento祝你好运。 –

0

试试这个

INSERT INTO catalog_product_entity_varchar(entity_id, value) 
    VALUES (
      SELECT entity_id, value 
      FROM catalog_product_entity_media_gallery 

      WHERE value_id = here the row id of value_id which have those values 4,74,0) 
0

假设在catalog_product_entity_varcharvalued_idautoincrement,你能不能执行以下操作?

USE magento_db; 
INSERT INTO catalog_product_entity_varchar(entity_type_id, store_id, entity_id, value) 

SELECT 
4, 
74, 
catalog_product_entity_media_gallery.entity_id, 
catalog_product_entity_media_gallery.value 

FROM catalog_product_entity_media_gallery; 

注意,有一个在您catalog_product_entity_varchar表中没有attribute_id列。

+0

对不起,我在我的问题中犯了一个错误(现在编辑)valued_id是autoincrement,但attribute_id不是,需要插入。 – Sean

+0

不用担心,@SeanDunwoody,我真的应该刚刚添加我的'答案'作为评论。 – Appulus

相关问题