0

あるテーブルから別のテーブルにデータを挿入しようとしている 2 つのテーブルがあります。Web 上でこれを行う方法の例をいくつか見つけることができました。問題は、これらの例がほとんど同一のテーブル構造に依存していることです。 2つの間...あるテーブルのデータを、まったく異なる構造の別のテーブルに挿入しようとしていることがわかります。

「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 の初心者です)。

誰かが私を正しい方向に向けることができますか? 一部の列に静的な値を挿入しながら、メディア テーブルから一部のデータを挿入する方法はありますか? (これがすべて理にかなっていることを願っています)

4

3 に答える 3

1

クエリ構文は問題ありません。

ただし、テーブル内の一意キーと外部キーに問題があり、catalog_product_entity_varcharデータを挿入できない場合があります。また、クエリが他のクエリが完了するのを待っている可能性があるため (クエリがより大きなシナリオの一部に過ぎない場合)、これはロックの問題です。最も可能性が高いのは最初のケースです。

現在、質問には重要な詳細が欠けています。

  • クエリの実行に使用する MySQL クライアント / プログラミング コード。そのため、ケースを完全に確認して正しく再現することはできません
  • 実行するシナリオ。つまり、Web リクエスト中に一部のモジュールの 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 を必要な値に置き換えます。たとえば、'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- 次に、必要な属性の間違った ID として 74 が選択されたようです。したがって、外部キーでcatalog_product_entity_varcharレコードを挿入できませんでした。
  • に行が追加されませんcatalog_product_entity_varchar。属性 ID、属性コード、およびエンティティ タイプを間違えているようです。ATTRIBUTE_CODE および ATTRIBUTE_ENTITY_TYPE_ID として入力したものを再確認してください。


両方のクエリが引き続きハングする場合は、MySQL クライアントまたはサーバー、または実行シナリオに問題があります。



:最初のクエリは特定のケースでは意味があるかもしれませんが、いくつかの問題は、アプローチに問題がある可能性があることを示しています。

  1. ID に直通番号を使用しています。ただし、ID はインストールと Magento のバージョンによって異なります。実際の属性 ID を抽出する必要がある 2 番目のクエリの属性コードなど、より安定した値を使用することが期待されます。
  2. catalog_product_entity_media_gallery同じ製品の複数のエントリを保存できる ストレージからcatalog_product_entity_varchar、製品の 1 つのエントリのみを保存できるストレージ にデータをコピーします。つまり、そのような方法ですべてのデータをコピーすることはできません。おそらく、クエリは達成したい目標を反映していません。
  3. に挿入されたエンティティ タイプ ID は、catalog_product_entity_varchar属性 ID とは関係ありません。Magento では、これらは深く結びついているものです。テーブルに間違ったエンティティ タイプ ID を入力すると、Magento が正しく動作しないか、変更がまったく認識されません。
于 2012-11-29T19:00:37.963 に答える
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 )
于 2012-11-29T12:52:15.757 に答える
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

于 2012-11-29T12:57:46.300 に答える