2012-11-29 243 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

相關問題