Tabelle „enterprise_url_rewrite“ – was speichert die Spalte „inc“?
-
29-09-2020 - |
Frage
Ich frage mich, was „inc“ bedeutet?In meinem speziellen Fall ist bei allen Umschreibungen inc=1 gesetzt.
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)
Danke!
Lösung
Im Folgenden geht es ausschließlich um die in dieser Tabelle gespeicherten Produkt-URLs, das Gleiche gilt jedoch auch für Kategorien.Dies dient lediglich dazu, Produkte zu debuggen, und um einfache Beispiele zu finden.
Es gibt nur zwei Stellen, an denen ich diesen Wert finden kann
1.Erhöhen des Zählers
Enterprise_UrlRewrite_Model_Index_Action_Url_Rewrite_RefreshAbstract::_refreshUrlRewrite
In dieser Methode gibt es eine Abfrage zum Aktualisieren der URL-Umschreibung, sie enthält ein bisschen PHP-Code wie:
$insert .= sprintf(' ON DUPLICATE KEY UPDATE %1$s = %1$s + 1',
$this->_getTable('enterprise_urlrewrite/url_rewrite') . '.inc');
Dies trägt dazu bei, eine wirklich unterhaltsam aussehende Abfrage zu generieren
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
Ganz am Ende ist zu beachten, dass dadurch der Zähler erhöht wird, wenn Integritätsbeschränkungsfehler vorliegen.
Wenn Produkte in diese Abfrage aufgenommen werden, bedeutet das, dass Ihnen nach dieser Abfrage der entsprechende Eintrag fehlt enterprise_catalog_product_rewrite
.Durch die Suche können Sie prüfen, welche Produkte fehlen select entity_id, sku from catalog_product_entity where entity_id not in(select product_id from enterprise_catalog_product_rewrite);
.
Dies liegt daran, dass der Anforderungspfad bereits vorhanden ist enterprise_url_rewrite
Für den angegebenen Entitätstyp/Speicher sollte Folgendes angezeigt werden: inc
Die Zahl wird bei jeder Ausführung dieser Abfrage erhöht, wenn für diese Entität eine Einschränkungsverletzung vorliegt.
Diese Logik befindet sich in der abstrakten Klasse und diese Methode wird in keiner ihrer untergeordneten Methoden überschrieben, was bedeutet, dass sie konsistent ist
- Changelog (Mview / Update nach Zeitplan)
- Zeile (Aktualisierung beim Speichern)
- Aktualisieren (vollständige Neuindizierung)
Dies bedeutet, dass alle Neuindizierungen für URLs die gleiche Fallback-Logik haben: „Bei Fehler Zähler erhöhen“.
2.Verwendung des Inkrementwerts
Beide der folgenden Anruf parent::_getUrlRewriteSelectSql
Enterprise_UrlRewrite_Model_Index_Action_Url_Rewrite_Redirect_Refresh_Row::_getUrlRewriteSelectSql
Enterprise_UrlRewrite_Model_Index_Action_Url_Rewrite_Redirect_Refresh_Changelog::_getUrlRewriteSelectSql
Welches ist definiert alsEnterprise_UrlRewrite_Model_Index_Action_Url_Rewrite_Redirect_Refresh::_getUrlRewriteSelectSql
Ist der einzige andere Ort, den ich sehen kann, der das verwendet .inc
Wert in der Datenbank.
Diese nennen im Grunde ein insertFromSelect
Aussage, und es sieht wirklich gruselig aus wie:
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
Der Schlüsselteil, den ich sehe, istCASE WHEN ur.inc IS NULL OR
M.
Wert= 1 THEN '' ELSE CONCAT('-', ur.inc) END)
.Wenn Inkrement null ist, wenden Sie keinen Inkrementwert an, andernfalls verketten Sie ihn mit dem Ende der URL.Diese Abfrage wird in die Logik von Schritt 1 eingespeist, wo es versucht wird _refreshUrlRewrite
aber möglicherweise mit einem Zahleninkrement am Ende.
Alles in allem denke ich, dass diese Logik vorhanden ist, um die Nummer zu verfolgen, die am Ende der URL angewendet werden soll, wenn ein Duplikat auftritt.