Magento 2: Ошибка неопределенного индекса при обновлении M 2.2.5> M 2.3.1


При запуске программы установки bin/Magento: команда обновления я столкнулся с этой ошибкой.

Создание/обновление схемы: Примечание: Неопределенный индекс: core_store в /data/websites/website_url/public_html/vendor/magento/framework/Setup/Declaration/Schema/Db/SchemaBuilder.php на линии 152

Для обновления Magento я следую приведенным ниже инструкциям по ссылке, но теперь сталкиваюсь с этим проблема. https://digitalstartup.co.uk/t/how-to-upgrade-from-magento-2-2-8-to-2-3-1/528

Любая помощь будет признательна.

Author: sourabh yadav, 2019-05-22

5 answers

Проблема в том, что SchemaBuilder.php пытается найти таблицу, которая не существует в текущей базе данных . Вероятно, у вас есть старая ссылка на таблицу внешних ключей (возможно, начиная с 1.9), вызывающая этот сбой.

Вы должны выполнить эти 2 запроса (например, таблицы и ключи могут быть разными):

ALTER TABLE `wordpress_association` DROP FOREIGN KEY `FK_STORE_ID_WP_ASSOC`;
ALTER TABLE `wordpress_association` ADD CONSTRAINT `FK_STORE_ID_WP_ASSOC` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON DELETE CASCADE ON UPDATE CASCADE;

РЕДАКТИРОВАТЬ

Эта проблема может быть вызвана также из других таблиц (не только wordpress_association). Основной причиной является неправильная ССЫЛКА во ВНЕШНЕМ КЛЮЧЕ на один из ваших столиков. Обычно это происходит после миграции с Magento 1.x на Magento 2.x.

 3
Author: Marco Valenziano, 2020-09-23 11:03:26

Чтобы решить эту проблему, я добавил условие "если", чтобы игнорировать код, если появится этот индекс [core_store].

// replace 
if($tables[$referenceTableName] != 'core_store' ){
    if (isset($tables[$referenceTableName]) && $referenceTableName !== $tableName) {
        $this->processReferenceKeys([$referenceTableName => 
        $tables[$referenceTableName]], $schema);
        unset($tables[$referenceTableName]);
    }
}
 0
Author: sourabh yadav, 2019-07-01 08:32:03

Я решил эту проблему, выполнив следующие действия

  1. Экспортировал дамп SQL для базы данных
  2. Искал core_store из-за ошибки Undefined index: core_store
  3. Удалил все внешние ключи, ссылающиеся на эту таблицу
  4. Полностью отбросил эту таблицу, так как она больше не была нужна.

Это решило мою проблему.

Но не забудьте сохранить резервную копию базы данных, прежде чем делать это.

 0
Author: Prabhu, 2020-04-15 02:21:43

У меня та же проблема. Я не люблю изменять основной код. Поэтому я просто открыл этот файл:

vendor/magento/framework/Setup/Declaration/Schema/Db/SchemaBuilder.php

И добавьте несколько отладочных сообщений, чтобы узнать, в чем проблема. Скрипт останавливается на зависимостях FK для плоских таблиц.

Поэтому моим решением было удалить их. После этого bin/magento setup:upgrade запускается без ошибки!

 0
Author: Ivan Gartsev, 2020-04-17 11:14:39

У меня была та же ошибка после добавления префикса (через phpmyadmin) в таблицу sequence_product и копирования таблицы из другой базы данных magento в мою базу данных.

Проблема: Таблица с префиксами все еще использовалась вместо скопированной, поэтому мне пришлось выяснить, в какой таблице все еще используется таблица с префиксами вместо скопированной.

Мне пришлось отлаживать файл vendor/magento/framework/Setup/Declaration/Schema/Db/SchemaBuilder.php чтобы добавить некоторую отладку вывод:

    private function processReferenceKeys(array $tables, Schema $schema)
    {
$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/zend_debug.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);

        foreach ($tables as $table) {

$logger->info("Table: " . $table->getName());

            $tableName = $table->getName();
            if ($schema->getTableByName($tableName) instanceof Table) {
                continue;
            }
            $referencesData = $this->dbSchemaReader->readReferences($tableName, $table->getResource());
            $references = [];

            foreach ($referencesData as $referenceData) {
                //Prepare reference data
                $referenceData['table'] = $table;
                $referenceTableName = $referenceData['referenceTable'];
$logger->info("Ref-Table: " . $referenceTableName);
                $referenceData['column'] = $table->getColumnByName($referenceData['column']);
                $referenceData['referenceTable'] = $this->tables[$referenceTableName];
                $referenceData['referenceColumn'] = $referenceData['referenceTable']->getColumnByName(
                    $referenceData['referenceColumn']
                );

                $references[$referenceData['name']] = $this->elementFactory->create('foreign', $referenceData);
                //We need to instantiate tables in order of references tree
                if (isset($tables[$referenceTableName]) && $referenceTableName !== $tableName) {
                    $this->processReferenceKeys([$referenceTableName => $tables[$referenceTableName]], $schema);
                    unset($tables[$referenceTableName]);
                }
            }

            $table->addConstraints($references);
            $schema->addTable($table);
        }
    }

Теперь запустите bin setup:upgrade еще раз и просмотрите файл журнала /var/log/zend_debug.log.

Посмотрите на последние записи, вы увидите таблицу и таблицу ссылок. В моем случае это был стол email_catalog.

Теперь откройте таблицу в phpmyadmin, перейдите на вкладку структура, затем на представление отношений и выберите правильную таблицу

enter image description here

enter image description here

Чему вы должны научиться из этого:

Никогда не добавляйте префикс таблицы к сделай резервную копию! Вместо этого создайте новую базу данных и скопируйте в нее таблицы, которые вы пытаетесь создать резервную копию.

 0
Author: Black, 2020-09-21 09:45:45