Очистка базы данных shop_feature_values_text Есть решение

У меня существует несколько своих полей с описанием товара.

Эти поля часто/постоянно обновляются из импорта CSV

И получается так, что при изменении этого поля старое значение по всей видимости остается  в базе данных в таблице shop_feature_values_text  хоть и удаляется ссылка на него из таблицы shop_product_features

Чтобы не делать из базы помойку, запускаю следующий запрос в базу данных для ручной очистки таблицы. Правильно ли я делаю? или нужны дополнительные условия?

delete FROM shop_feature_values_text WHERE id NOT IN (SELECT feature_value_id FROM shop_product_features) 

Если по простому - удалить значение характеристики в таблице shop_feature_values_text если отсутствует на него ссылка по ID в  таблице ссылок shop_product_features

3 ответа

  • 1
    Михаил Ушенин Webasyst 7 июня 2019 13:07 # Решение

    Так вы можете не удалить все лишние записи, потому что в таблице shop_product_features могут храниться записи с одинаковыми feature_value_id для разных типов характеристик.

    Для более точного удаления лучше проверять тип характеристики при выборке id значений из shop_product_features:

    DELETE fvt
    FROM shop_feature_values_text fvt
    WHERE fvt.id NOT IN
    (
        SELECT pf.feature_value_id
        FROM shop_product_features pf
        WHERE pf.feature_id IN (
            SELECT f.id
            FROM shop_feature f
        	WHERE f.type = 'text'
        )
    )

    • +1
      Sawer Sawer 7 июня 2019 14:12 #

      250 мегабайт за несколько секунд минусом. Спасибо вам большое. Еще бы как то в крон это дело засунуть чтобы по ночам чистилось само. Наверно php скриптом можно

      • +2

        Например, таким файлом clean_text_feature_values.php в корне сайта:

        <?php
        
        //allow only command-line execution
        if (php_sapi_name() !== 'cli') {
            die();
        }
        
        require_once(dirname(__FILE__).'/wa-config/SystemConfig.class.php');
        waSystem::getInstance(null, new SystemConfig());
        
        $model = new waModel();
        $model->exec(
            'DELETE fvt
            FROM shop_feature_values_text fvt
            WHERE fvt.id NOT IN
            (
                SELECT pf.feature_value_id
                FROM shop_product_features pf
                WHERE pf.feature_id IN (
                    SELECT f.id
                    FROM shop_feature f
                    WHERE f.type = "text"
                )
            )'
        );
        

  • 1
    Sawer 7 июня 2019 15:02 #

    запускаю из кроновесты

    sudo /usr/bin/php /home/admin/web/ХХХ.ru/public_html/clean_text_feature_values.php

    Получаю

    PHP: syntax error, unexpected TC_CONSTANT in /etc/php/7.2/cli/php.ini on line 310

    В конце файла добавил закрытие скрипта     -  ?>

    • +1

      Кажется, у вас синтаксическая ошибка в файле /etc/php/7.2/cli/php.ini на строке 310.

    • +2

      В конце файла добавил закрытие скрипта - ?>

      Это необязательно и даже нежелательно:

      Если файл содержит только код PHP, предпочтительно опустить закрывающий тег в конце файла. Это помогает избежать добавления случайных символов пробела или перевода строки после закрывающего тега PHP, которые могут послужить причиной нежелательных эффектов, так как PHP начинает выводить данные в буфер при отсутствии намерения у программиста выводить какие-либо данные в этой точке скрипта.

      Но в вашем случае это ни на что не повлияет. Просто имейте в виду.

      • +1
        Sawer Sawer 7 июня 2019 15:10 #

        В той строке php.ini

        open_basedir = no value

        закомментировал ее - вроде работает... только можно ли так


  • 1
    Sawer 11 июня 2019 16:07 #

    добавил в скрипт очистку shop_search_word, shop_search_index

    Может кому понадобится

    А то что в одной что в дургой через какое то время по полляма записей а умным поиском я не пользуюсь


    <?php
    //allow only command-line execution
    if (php_sapi_name() !== 'cli') {
    die();
    }
    require_once(dirname(__FILE__).'/wa-config/SystemConfig.class.php');
    waSystem::getInstance(null, new SystemConfig());
    $model = new waModel();
    $model->exec(
    'DELETE fvt
    FROM shop_feature_values_text fvt
    WHERE fvt.id NOT IN
    (
    SELECT pf.feature_value_id
    FROM shop_product_features pf
    WHERE pf.feature_id IN (
    SELECT f.id
    FROM shop_feature f
    WHERE f.type = "text"
    )
    )'
    );
    $model->exec(
    'truncate shop_search_word'
    );
    $model->exec(
    'truncate shop_search_index'
    );

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите