質問

私は"inc"とはどういう意味ですか?私の特定のケースでは、すべての書き換えはinc=1に設定されています。

mysql> describe enterprise_url_rewrite;
+----------------+----------------------+------+-----+---------+----------------+
| Field          | Type                 | Null | Key | Default | Extra          |
+----------------+----------------------+------+-----+---------+----------------+
| url_rewrite_id | int(10) unsigned     | NO   | PRI | NULL    | auto_increment |
| request_path   | varchar(255)         | NO   | MUL | NULL    |                |
| target_path    | varchar(255)         | NO   |     | NULL    |                |
| is_system      | smallint(5) unsigned | NO   |     | NULL    |                |
| guid           | varchar(32)          | NO   |     | NULL    |                |
| identifier     | varchar(255)         | NO   | MUL | NULL    |                |
| inc            | int(10) unsigned     | NO   |     | 1       |                |
| value_id       | int(10) unsigned     | NO   | MUL | NULL    |                |
| store_id       | smallint(5) unsigned | NO   |     | NULL    |                |
| entity_type    | smallint(5) unsigned | NO   |     | NULL    |                |
+----------------+----------------------+------+-----+---------+----------------+
10 rows in set (0.00 sec)

ありがとう!

役に立ちましたか?

解決

以下のすべては、この表に格納されている製品urlに焦点を当てていますが、同じことがカテゴリにも適用されます。これは単に製品が私がデバッグしていたものであり、簡単な例のためです。

この値が使用されている場所は2つしかありません

1.カウンタのインクリメント

Enterprise_UrlRewrite_Model_Index_Action_Url_Rewrite_RefreshAbstract::_refreshUrlRewrite

その方法では、urlの書き換えを更新するためのクエリがあり、次のようなPHPコードが少しあります:

$insert .= sprintf(' ON DUPLICATE KEY UPDATE %1$s = %1$s + 1',
$this->_getTable('enterprise_urlrewrite/url_rewrite') . '.inc');

これは、次のような本当に楽しい見た目のクエリを生成するのに役立ちます

INSERT INTO `enterprise_url_rewrite` (`request_path`, `target_path`, 
`guid`, `is_system`, `identifier`, `value_id`, `store_id`, 
`entity_type`) SELECT `uk`.`value` AS `request_path`, 
CONCAT('catalog/product/view/id/', uk.entity_id) AS `target_path`, 
'66af826f9f0df53191c06afe93c03159' AS `guid`, 1 AS `is_system`, 
`uk`.`value` AS `identifier`, `uk`.`value_id`, `uk`.`store_id`, 3 AS
`entity_type` FROM `catalog_product_entity_url_key` AS `uk` WHERE 
(uk.entity_id IN ('19472')) ON DUPLICATE KEY UPDATE 
enterprise_url_rewrite.inc = enterprise_url_rewrite.inc + 1

注意すべきことは最後にありますが、これは整合性制約エラーがある場合にカウンタをインクリメントします。

製品がこのクエリに入る場合は、このクエリの後に対応するエントリが欠落していることを意味します enterprise_catalog_product_rewrite.検索することで、どの製品が不足しているかを確認することができます select entity_id, sku from catalog_product_entity where entity_id not in(select product_id from enterprise_catalog_product_rewrite);.

これは、要求パスがすでに存在するためです enterprise_url_rewrite 指定されたエンティティタイプ/ストアでは、次のように表示されます inc エンティティに制約違反がある場合、このクエリが実行されるたびに数値が増加します。

このロジックは抽象クラスにあり、このメソッドはその子メソッドのいずれでもオーバーライドされません。

  • 変更履歴(Mview/スケジュール上の更新)
  • 行(保存時に更新)
  • リフレッシュ(完全なインデックス再作成)

これは、urlのすべての再インデックスに、「エラーの場合、インクリメントカウンタ」という同じフォールバックロジックがあることを意味します。

2.インクリメント値を使用する

次の呼び出しの両方 parent::_getUrlRewriteSelectSql

  • Enterprise_UrlRewrite_Model_Index_Action_Url_Rewrite_Redirect_Refresh_Row::_getUrlRewriteSelectSql
  • Enterprise_UrlRewrite_Model_Index_Action_Url_Rewrite_Redirect_Refresh_Changelog::_getUrlRewriteSelectSql

これは次のように定義されます Enterprise_UrlRewrite_Model_Index_Action_Url_Rewrite_Redirect_Refresh::_getUrlRewriteSelectSql

私はそれを使用して見ることができる唯一の他の場所です .inc データベース内の値。

これらは基本的に呼び出します insertFromSelect 文、そしてそれは本当に危険なように見えます:

SELECT CONCAT(r.identifier, CASE  WHEN ur.inc IS NULL OR `m`.`value` = 1 THEN '' 
ELSE CONCAT('-', ur.inc) END) AS `request_path`, `r`.`target_path`,
'65912c647bc5f65fc0f59df5f6477d05' AS `guid`, 0 AS `is_system`, 
CONCAT(r.identifier, CASE  WHEN ur.inc IS NULL OR `m`.`value` = 1 
THEN '' ELSE CONCAT('-', ur.inc) END) AS `identifier`, 
`r`.`redirect_id` AS `value_id`, `r`.`store_id`, 1 AS `entity_type`
FROM `enterprise_url_rewrite_redirect` AS `r` LEFT JOIN
enterprise_url_rewrite` AS `ur` ON ur.identifier = r.identifier
AND ur.store_id = r.store_id AND ur.entity_type = 1 LEFT JOIN 
`enterprise_index_multiplier` AS `m` ON ur.identifier IS NOT NULL

私が見る重要な部分はCASE WHEN ur.inc IS NULL ORm.= 1 THEN '' ELSE CONCAT('-', ur.inc) END).Incrementがnullの場合は、increment値を適用せず、それ以外の場合はURLの末尾に連結します。このクエリは、ステップ1のロジックに入力され、次のように試行されます _refreshUrlRewrite しかし、潜在的には最後に数字の増分があります。

このロジックは、重複が発生したときにurlの最後に適用される番号を追跡するためのものだと思います。

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top