Как мне удалить все из таблицы, кроме 1 записи в MySQL? - PullRequest
0 голосов
/ 31 марта 2011

Итак, у меня есть модуль импорта / экспорта для OpenCart, но он стирает всю таблицу параметров продукта перед вставкой новых данных ...

Мне нужно разработать поддержку для стороннего модуля параметров продукта, который у меня есть,но в то же время - я полагаю, что я просто остановил бы удаление важного столбца в моей таблице параметров продукта.

В таблице product_option_value у меня есть 'product_option,' 'product_id,' 'количествои т. д., и есть один столбец с именем «информация», который я не хочу стереть.Метод ниже:

function storeOptionsIntoDatabase( &$database, &$options ) 
{
    // find the default language id
    $languageId = $this->getDefaultLanguageId($database);

    // start transaction, remove options
    $sql = "START TRANSACTION;\n";
    $sql .= "DELETE FROM `".DB_PREFIX."product_option`;\n";
    $sql .= "DELETE FROM `".DB_PREFIX."product_option_description` WHERE language_id=$languageId;\n";
    $sql .= "DELETE FROM `".DB_PREFIX."product_option_value`;\n";
    $sql .= "DELETE FROM `".DB_PREFIX."product_option_value_description` WHERE language_id=$languageId;\n";
    $this->import( $database, $sql );

    ...more code...
}

Я не очень знаком с MySQL, но хочу кое-что с эффектом:

$sql .= "DELETE FROM `".DB_PREFIX."product_option_value` WHERE column != 'info';\n";

Спасибо!

Редактировать:

Я попытался предложить Майклу использовать UPDATE и явно установить их все в NULL ... но это вернуло эту ошибку:

Ошибка: Дублироватьзапись '0' для ключа 1 Ошибка №: 1062 ОБНОВЛЕНИЕ oc_product_option_value SET product_option_value_id = NULL, product_option_id = NULL, product_id = NULL, количество = NULL, вычитание = NULL, цена = NULL, префикс = NULL, sort_order = NULL, вес =NULL, sku = NULL, image = NULL

Я попытался извлечь первичный ключ:

$ sql. = "ОБНОВЛЕНИЕ ".DB_PREFIX."product_option_value SET product_option_id = NULL, product_id= NULL, количество = NULL, вычитать = NULL, цена = NULL, префикс = NULL, sort_order = NULL, вес = NULL; \ n ";

, но я получаю:

Ошибка: повторяющаяся запись '1' для ключа 1 Ошибка №: 1062 INSERT INTO `oc_product ....

Редактировать:

Хорошо,поэтому я удалилполе mary_key 'из INSERT ... и я не получил сообщений об ошибках при загрузке.Но когда я просматриваю товар с такими опциями, я получаю это сообщение в верхней части моей страницы:

Примечание: неопределенный индекс: имя в /httpdocs/ocart/catalog/model/catalog/product.phpв строке 418 Примечание: неопределенный индекс: имя в /httpdocs/ocart/catalog/model/catalog/product.php в строке 418Notic .... повторяется

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Убедитесь, что я понимаю: Вы хотите удалить значения из всех столбцов таблицы product_option_value, за исключением столбца info?Если это то, что вы хотите, то может сработать следующее.Пожалуйста, не запускайте его, пока мы не выясним, что вы пытаетесь сделать! Синтаксис

DELETE FROM подразумевает удаление из имени таблицы, а не имени столбца.Вместо этого вам нужно будет UPDATE в ваших строках установить все столбцы, кроме того, который вы намерены оставить либо NULL, либо пустым, либо их значение по умолчанию.добавьте условие WHERE, если вам нужно сохранить некоторые строки без изменений!Без WHERE этот запрос обнулит все столбцы, указанные во всей таблице.

UPDATE product_option_value
SET 
  product_option = NULL,
  product_id = NULL,
  quantity = NULL,
  etc...
WHERE (some where condition if you need one)
0 голосов
/ 31 марта 2011

Я добавляю второй ответ, используя совершенно другой подход, который позволяет избежать проблем с SQL.

  1. Экспорт таблицы в виде текстового файла, разделенного запятыми. Вы можете сделать это с помощью phpmyadmin или MySQL Workbench.
  2. Откройте CSV в электронной таблице
  3. Очистите столбцы, которые вы хотите очистить.
  4. Сохранить как новый CSV
  5. Импортируйте CSV обратно в базу данных, используя phpmyadmin, Workbench или синтаксис LOAD DATA LOCAL INFILE.
...