gpt4 book ai didi

mysql - Magento如何管理外键约束

转载 作者:行者123 更新时间:2023-11-29 00:17:06 24 4
gpt4 key购买 nike

我最近升级到mage 1.8.1。似乎一切都很好,但重新指数产品价格。发现以下错误:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`threeleavednew`.`catalog_product_index_tier_price`, CONSTRAINT `FK_CAT_PRD_IDX_TIER_PRICE_ENTT_ID_CAT_PRD_ENTT_ENTT_ID` FOREIGN KEY (`entity_id`) REFERENCES `catalog_product_entity` (`entity_id)

此数据库在升级前由phpMyadmin导出,并导入到新的空数据库(在我的域宿主下创建)。我刚刚提取了mage 1.8.1.tar.gz并复制到我的主题上,然后通过修改local.xml(保持加密密钥不变)将mage1.8指向新的数据库,将mage1.8目录重命名为httpdocs并启动我的站点。。。。
我不确定这种升级方式是否会导致数据库外键问题。
我的旧站点是从其他开发人员转移过来的,我不确定数据库是否在第一天就出现了FK问题,这可能与1.8版不兼容。
我所做的是
1)在phpMyadmin中使用下面的语句
select *
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where CONSTRAINT_TYPE = 'FOREIGN KEY';

从旧数据库、当前数据库和Mage sample数据库转储所有外键。做比较。
2)在phpMyadmin中运行export以转储当前数据库和Mage sample数据库,并与升级前导出的旧数据库进行比较。
以下是结果。
1)在Mage sample DB foreign keys表中,我可以找到目录产品索引层价格表的三个FK键,如下所示
'FK_CAT_PRD_IDX_TIER_PRICE_CSTR_GROUP_ID_CSTR_GROUP_CSTR_GROUP_ID',
'FK_CAT_PRD_IDX_TIER_PRICE_ENTT_ID_CAT_PRD_ENTT_ENTT_ID',
'FK_CAT_PRD_IDX_TIER_PRICE_WS_ID_CORE_WS_WS_ID',

产品目录表1,表2,表3各一张。
'FK_CAT_PRD_FLAT_1_ENTT_ID_CAT_PRD_ENTT_ENTT_ID',
'FK_CAT_PRD_FLAT_2_ENTT_ID_CAT_PRD_ENTT_ENTT_ID',
'FK_CAT_PRD_FLAT_3_ENTT_ID_CAT_PRD_ENTT_ENTT_ID',

但是,当我尝试在不同的时间从旧数据库和当前数据库转储FK表时,有时我可以找到目录产品索引层价格表的三个FK,有时我根本找不到它们,有时会找到FK名称,如“FK 6E08D719F0501DD1D8E6D4EFF2511C85”。而且我从来没有找到任何FK的目录产品平1,平2,平3表。
2)在旧数据库和当前导出的数据库.sql文件中,我没有找到如下语句来为表catalog_product_index_tier_price和catalog_product_flat_1,_2,_3添加FK,但我在Mage sample DB的导出的.sql文件中找到了它们。
ALTER TABLE `catalog_product_index_tier_price`
ADD CONSTRAINT `FK_CAT_PRD_IDX_TIER_PRICE_CSTR_GROUP_ID_CSTR_GROUP_CSTR_GROUP_ID` FOREIGN KEY (`customer_group_id`) REFERENCES `customer_group` (`customer_group_id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `FK_CAT_PRD_IDX_TIER_PRICE_ENTT_ID_CAT_PRD_ENTT_ENTT_ID` FOREIGN KEY (`entity_id`) REFERENCES `catalog_product_entity` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `FK_CAT_PRD_IDX_TIER_PRICE_WS_ID_CORE_WS_WS_ID` FOREIGN KEY (`website_id`) REFERENCES `core_website` (`website_id`) ON DELETE CASCADE ON UPDATE CASCADE;


ALTER TABLE `catalog_product_flat_1`
ADD CONSTRAINT `FK_CAT_PRD_FLAT_1_ENTT_ID_CAT_PRD_ENTT_ENTT_ID` FOREIGN KEY (`entity_id`) REFERENCES `catalog_product_entity` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE;

好吧,看来我的旧数据库和当前数据库都有FK问题,症状不稳定。很明显,我的所有历史数据库备份文件都没有为那些表添加FK的语句,其中一个表用于导入mage 1.8中遇到问题的数据库。我没有办法检查我的问题是由错误的升级方式引起的,或者从第一天起就有可能存在。
我的问题是
Mage 1.8管理DB与以前的版本不同吗?尽管我不这么认为。
Magento实际上是如何管理FK约束的?它是在一开始就分配FK约束名称和关系,并保持所有这些名称和关系静态不变,还是在销售或客户更改时动态分配/重新分配FK约束名称和关系?我的理解是FK约束的名称和关系永远不会改变,它的数据会随着站点的运行而改变。
为什么phpMyadmin export函数使用比Mage sample DB上的相同转储更少的“add constrain”语句转储DB backup(甚至在站点正常运行时升级之前)?这是否意味着我的数据库从第一天起就有错误/问题FK?如果是,为什么我只有在升级到1.8之后才遇到问题?
假设Magento静态地管理FKs,是否有一个标准/引用Magento-FK约束列表,我们可以将其与问题列表进行比较,以便于DB调试?
我真的迷路了,希望有人能帮我解决这些问题。提前谢谢你。
我在谷歌搜索上看到了很多类似于我的mage-FK错误线程,没有一个给我一个合理的逻辑解决方案和解释。我期待一个解决方案,我可以看到为什么和如何解决问题,而不是告诉我“截断一些表,你会得到解决问题”。。。。
非常感谢你。
更新:我已经试过跟踪查询流程,并找到一些信息,希望主人知道问题在哪里。
## 17493 ## TRANSACTION BEGIN
TIME: 0.0001
## 2014-03-28 18:00:03
## 17493 ## QUERY
SQL: DELETE FROM `catalog_product_index_price_idx`
AFF: 410
TIME: 0.0055
## 2014-03-28 18:00:03
## 17493 ## QUERY
SQL: SELECT `cw`.`website_id`, `csg`.`default_store_id` AS `store_id` FROM `core_website` AS `cw`
INNER JOIN `core_store_group` AS `csg` ON cw.default_group_id = csg.group_id WHERE (cw.website_id != 0)
AFF: 1
TIME: 0.0006
## 2014-03-28 18:00:03
## 17493 ## QUERY
SQL: DELETE FROM `catalog_product_index_website`
AFF: 1
TIME: 0.0003
## 2014-03-28 18:00:03
## 17493 ## QUERY
SQL: INSERT INTO `catalog_product_index_website` (`website_id`,`website_date`,`rate`) VALUES (?, ?, ?)
BIND: array ( 0 => '1', 1 => '2014-03-29', 2 => 1,)
AFF: 1
TIME: 0.0002
## 2014-03-28 18:00:03
## 17493 ## QUERY
SQL: DELETE FROM `catalog_product_index_tier_price`
AFF: 0
TIME: 0.0002
## 2014-03-28 18:00:03
## 17493 ## QUERY
SQL: DESCRIBE `catalog_product_index_tier_price`
AFF: 4
TIME: 0.0005

## 2014-03-28 18:00:03
## 17493 ## QUERY
SQL: INSERT INTO `catalog_product_index_tier_price` SELECT `tp`.`entity_id`, `cg`.`customer_group_id`, `cw`.`website_id`, MIN(IF(tp.website_id = 0, ROUND(tp.value * cwd.rate, 4), tp.value)) FROM `catalog_product_entity_tier_price` AS `tp`
INNER JOIN `customer_group` AS `cg` ON tp.all_groups = 1 OR (tp.all_groups = 0 AND tp.customer_group_id = cg.customer_group_id)
INNER JOIN `core_website` AS `cw` ON tp.website_id = 0 OR tp.website_id = cw.website_id
INNER JOIN `catalog_product_index_website` AS `cwd` ON cw.website_id = cwd.website_id WHERE (cw.website_id != 0) GROUP BY `tp`.`entity_id`,
`cg`.`customer_group_id`,
`cw`.`website_id` ON DUPLICATE KEY UPDATE `min_price` = VALUES(`min_price`)
TIME: 0.0069

## 2014-03-28 18:00:03
EXCEPTION
exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`threeleavednew`.`catalog_product_index_tier_price`, CONSTRAINT `FK_CAT_PRD_IDX_TIER_PRICE_ENTT_ID_CAT_PRD_ENTT_ENTT_ID` FOREIGN KEY (`entity_id`) REFERENCES `catalog_product_entity` (`entity_)' in /var/www/vhosts/3leavedcart.com/httpdocs/lib/Zend/Db/Statement/Pdo.php:228
Stack trace:
#0 /var/www/vhosts/3leavedcart.com/httpdocs/lib/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array)
#1 /var/www/vhosts/3leavedcart.com/httpdocs/lib/Varien/Db/Statement/Pdo/Mysql.php(110): Zend_Db_Statement_Pdo->_execute(Array)
#2 /var/www/vhosts/3leavedcart.com/httpdocs/app/code/core/Zend/Db/Statement.php(291): Varien_Db_Statement_Pdo_Mysql->_execute(Array)
#3 /var/www/vhosts/3leavedcart.com/httpdocs/lib/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array)
#4 /var/www/vhosts/3leavedcart.com/httpdocs/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `ca...', Array)
#5 /var/www/vhosts/3leavedcart.com/httpdocs/lib/Varien/Db/Adapter/Pdo/Mysql.php(428): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ca...', Array)
#6 /var/www/vhosts/3leavedcart.com/httpdocs/app/code/core/Mage/Catalog/Model/Resource/Product/Indexer /Price.php(455): Varien_Db_Adapter_Pdo_Mysql->query('INSERT INTO `ca...')
#7 /var/www/vhosts/3leavedcart.com/httpdocs/app/code/core/Mage/Catalog/Model/Resource/Product/Indexer /Price.php(379): Mage_Catalog_Model_Resource_Product_Indexer_Price->_prepareTierPriceIndex()
#8 /var/www/vhosts/3leavedcart.com/httpdocs/app/code/core/Mage/Index/Model/Indexer/Abstract.php(143): Mage_Catalog_Model_Resource_Product_Indexer_Price->reindexAll()
#9 /var/www/vhosts/3leavedcart.com/httpdocs/app/code/core/Mage/Index/Model/Process.php(210): Mage_Index_Model_Indexer_Abstract->reindexAll()
#10 /var/www/vhosts/3leavedcart.com/httpdocs/app/code/core/Mage/Catalog/Model/Observer.php(203): Mage_Index_Model_Process->reindexAll()
#11 [internal function]: Mage_Catalog_Model_Observer->reindexProductPrices(Object(Mage_Cron_Model_Schedule))
#12 /var/www/vhosts/3leavedcart.com/httpdocs/app/code/core/Mage/Cron/Model/Observer.php(325): call_user_func_array(Array, Array)
#13 /var/www/vhosts/3leavedcart.com/httpdocs/app/code/core/Mage/Cron/Model/Observer.php(72): Mage_Cron_Model_Observer->_processJob(Object(Mage_Cron_Model_Schedule), Object(Mage_Core_Model_Config_Element))
#14 /var/www/vhosts/3leavedcart.com/httpdocs/app/code/core/Mage/Core/Model/App.php(1338): Mage_Cron_Model_Observer->dispatch(Object(Varien_Event_Observer))
#15 /var/www/vhosts/3leavedcart.com/httpdocs/app/code/core/Mage/Core/Model/App.php(1317): Mage_Core_Model_App->_callObserverMethod(Object(Mage_Cron_Model_Observer), 'dispatch', Object(Varien_Event_Observer))
#16 /var/www/vhosts/3leavedcart.com/httpdocs/app/Mage.php(448): Mage_Core_Model_App->dispatchEvent('default', Array)
#17 /var/www/vhosts/3leavedcart.com/httpdocs/cron.php(76): Mage::dispatchEvent('default')
#18 {main}

下面是mysqld.log文件中的
140319 16:41:21  InnoDB: Error: in ALTER TABLE `threeleavednew`.`catalog_product_index_tier_price`
InnoDB: has or is referenced in foreign key constraints
InnoDB: which are not compatible with the new table definition.

我还比较了数据库中的表catalog_product_index_tier_price与Mage sample DB中的表catalog_product_index_price在表结构和相关约束名称+关系方面的差异……事实上,我比较了10多个我怀疑的表,没有任何线索。
谢谢您。

最佳答案

我觉得你有点太复杂了。Magento具有FK约束,这些约束在安装时已设置。我认为可能发生的情况是,您的Magento的DB结构一路上被破坏了,就在最近您升级到1.8的时候-表被修饰了一点,当它们被修饰时,FK约束被重置为它们应该是的。
长话短说,您可能有一个坏的扩展,或者您可能想看看是什么导致了您的数据库结构损坏。更可能的是,新的结构是正确的,因为你刚刚升级。
最后一点:价格指数的好处是,它是可以截断表并重新应用索引的索引之一,而不会产生任何后果。我建议你这样做,看看是否有用。

关于mysql - Magento如何管理外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22590843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com