将数据从一个表插入另一个表?

时间:2012-11-29 12:38:59

标签: mysql sql magento

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

我正在尝试将名为“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;

我只需要来自media_gallery的entity_id和值,其他值总是相同的,我尝试使用上面这样做,但这只是挂在MySQL(没有错误)

我认为这是因为我试图从catalog_product_entity_media_gallery中选择4,74和0,但我不是百分百肯定(道歉,我对MySQL有点新手)

有人能指出我正确的方向吗?有没有办法在插入某些列的静态值时从媒体表中插入一些数据? (我希望这一切都有意义)

3 个答案:

答案 0 :(得分:1)

查询语法没问题。

但是,catalog_product_entity_varchar表中的唯一键和外键可能存在问题,这些键不允许您插入数据。此外,查询可能正在等待其他一些查询完成(如果您的查询只是更大方案的一部分),那么这是一个锁定问题。最可能的是第一种情况。

目前,这个问题缺乏重要的细节:

  • 用于执行查询的MySQL客户端/编程代码。所以我们
  • 无法正确查看案例并正确复制
  • 您执行的方案。即你是否在Magento应用程序中执行了一些操作 Web请求期间的模块。或者脚本中是否还有其他查询, 一些打开的交易,其他人访问数据库服务器等等。

根据最可能的假设,您只是看不到使用唯一/外键的实际错误,您可以尝试以下查询。


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替换为您需要的值,例如'firstname'和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. 您正在使用ID的直接数字。但是对于不同的安装和Magento版本,ID是不同的。它应该使用更稳定的值,例如第二个查询中的属性代码,您应该通过它提取实际的属性ID。
  2. 您可以将存储catalog_product_entity_media_gallery中的数据复制到存储catalog_product_entity_varchar,存储catalog_product_entity_varchar可以存储同一产品的多个条目,而存储{{1}}只能存储该产品的一个条目。这意味着,您无法以这种方式复制所有数据。您的查询可能并不反映您希望实现的目标。
  3. 插入{{1}}的实体类型ID与属性ID无关。在Magento中,这些是相互关联的东西。在表中放入错误的实体类型ID会导致Magento行为不正确,或者根本不会注意到您的更改。

答案 1 :(得分: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 )

答案 2 :(得分:0)

假设valued_id表中的catalog_product_entity_varcharautoincrement,您是否可以执行以下操作?

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;

请注意,attribute_id表格中没有catalog_product_entity_varchar列。