Numerischer Adobe Commerce-Datenbankwert außerhalb des Bereichs, INT bis BIGINT

WARNING
Vor der Implementierung der Lösung in diesem Artikel (INT zur Aktualisierung BIGINT Schemas) müssen Händler immer überprüfen, ob das Feld, das sie ändern werden, KEINE Fremdschlüsselbeziehungen zu einer anderen Tabelle aufweist. Wenn das Feld Fremdschlüsselbeziehungen zu einer anderen Tabelle hat, treten Probleme auf, da das zugehörige Feld weiterhin INT ist. Sie können die folgende Abfrage verwenden, um dies zu überprüfen. Diese Abfrage listet die Fremdschlüsselbeziehungen auf, die in der Datenbank für das angegebene Tabellenfeld verfügbar sind:
code language-mysql
SELECT
     TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
   INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
     REFERENCED_TABLE_SCHEMA = '<database_name>' AND
     REFERENCED_TABLE_NAME = '<table_name>' AND
     REFERENCED_COLUMN_NAME = '<table_field>';

Betroffene Produkte und Versionen

Dieser Artikel bietet Lösungen für Fälle, in denen Sie eine Produktaktualisierung nicht speichern können, z. B. eine Preisänderung oder das Löschen und Duplizieren eines Produkts.
Möglicherweise wird die Fehlermeldung angezeigt Das Lagerelement konnte nicht gespeichert werden. Bitte erneut versuchen. Die Bereitstellung kann nach einer Produktaktualisierung fehlschlagen. Möglicherweise wird auch die folgende MySQL-Fehlermeldung beim Ausführen von php bin/magento setup:upgrade angezeigt (in Adobe Commerce in der Cloud-Infrastruktur wird dieser Fehler in den Bereitstellungsprotokollen angezeigt):

SQLSTATE[22003]: Numeric value out of range: 167 Out of range value for column 'value_id' at row 1, query was: INSERT INTO `catalog_product_entity_decimal` (`attribute_id`,`store_id`,`row_id`,`value`) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE `attribute_id` = VALUES(`attribute_id`), `store_id` = VALUES(`store_id`), `row_id` = VALUES(`row_id`), `value` = VALUES(`value`)

Die im Artikel beschriebenen Lösungen sind:

  • Aktualisieren Sie die [ AUTO_INCREMENT ] auf den nächsten Wert aus der Tabelle oder
  • Aktualisierung des BIGINT-Schemas INT

Welche Lösung Sie verwenden, hängt von der Ursache des Problems ab. Gehen Sie wie folgt vor, um die Ursache zu isolieren.

Schritte zur Prüfung der Ursache

Überprüfen Sie den höchsten Wert des Primärschlüssels, indem Sie den folgenden Befehl am Terminal ausführen: SELECT MAX(value_id) FROM catalog_product_entity_int;

Wenn der max(value_id) kleiner als der max int(11) [ 4294967296 ] ist und der [ AUTO_INCREMENT ] einen Wert größer oder gleich dem max int(11) [ 4294967296 ] hat, Sie (den [ AUTO_INCREMENT ] auf den nächsten Wert aus der Tabelle aktualisieren. Andernfalls sollten Sie eine INT zur Aktualisierung BIGINT Schemas.

Aktualisieren Sie die AUTO_INCREMENT auf den nächsten Wert aus der Tabelle. update-the-auto-increment-to-the-next-value-from-the-table

WARNING
Führen Sie eine Datenbanksicherung durch, bevor Sie die Tabellen ändern. Setzen Sie die Site auch in den Wartungsmodus. Darüber hinaus wird empfohlen, den Befehl MySQL optimieren für die Datenbanktabellen (nur für Tabellen, in denen Änderungen vorgenommen wurden) auszuführen, nachdem die Änderungen vorgenommen wurden.
NOTE
Die Site sollte sich im Wartungsmodus befinden, während der Befehl „optimieren“ für bestimmte Tabellen ausgeführt wird. Dadurch werden Tabellen vollständig neu erstellt und nach dem Löschen von Daten aus Tabellen Speicherplatz freigegeben.

Wenn der angezeigte Wert kleiner als max int(11) [ 4294967296 ] ist, wie in der folgenden Beispiel-Terminalausgabe gezeigt, dann hat sich eine [ AUTO_INCREMENT ] in eine Zahl geändert, die größer oder gleich dem max [ int(11) ] ist.

MariaDB [xxx]> SELECT MAX(value_id) FROM catalog_product_entity_int;
+---------------------+
| MAX(source_item_id) |
+---------------------+
|          4283174130 |
+---------------------+

Um zu überprüfen, ob dies geschehen ist, führen Sie den folgenden Befehl im Terminal aus:

MariaDB [xxx]> show create table catalog_product_entity_int;

...
) ENGINE=InnoDB AUTO_INCREMENT=4294967297 DEFAULT CHARSET=utf8 COMMENT='Catalog Product Integer Attribute Backend Table';

Wie Sie in der obigen Beispielausgabe sehen können, hat sich die Tabelle [ AUTO_INCREMENT ] in eine größere Zahl geändert als die max int(11) [ 4294967296 ]. Die Lösung besteht darin, die [ AUTO_INCREMENT] auf den nächsten Wert aus der Tabelle zu aktualisieren:

ALTER TABLE catalog_product_entity_int AUTO_INCREMENT = 4283174131;

Aktualisierung des BIGINT-Schemas INT int_to_bigint_schema_update

Wenn jedoch beim Ausführen der folgenden Abfrage SELECT MAX(value_id) FROM catalog_product_entity_int; der angezeigte Wert höher ist als max int(11) [ 4294967296 ] eine INT zur BIGINT Schemaaktualisierung in Betracht ziehen. Der Datentyp BIGINT hat einen größeren Wertebereich.

Gehen Sie dazu folgendermaßen vor:

  1. Erstellen Sie ein benutzerdefiniertes Modul im Verzeichnis app/code/.
  2. Erstellen Sie im benutzerdefinierten Modul eine Datei db_schema.xml. In db_schema.xml Sie den Datentyp auf BIGINT festlegen.
  3. Fügen Sie den folgenden Inhalt hinzu und führen Sie dann bin/magento setup:upgrade aus, um die oben genannten Änderungen auf die entsprechende Tabelle anzuwenden.
<?xml version="1.0"?>
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
    <table name="catalog_product_entity_int">
        <column xsi:type="bigint" name="value_id" unsigned="false" nullable="false" identity="true"
                comment="Value ID"/>
    </table>
</schema>

Verwandtes Lesen

recommendation-more-help
8bd06ef0-b3d5-4137-b74e-d7b00485808a