Как мне удалить все из таблицы, кроме 1 записи в MySQL?
Итак, у меня есть модуль импорта / экспорта для OpenCart, но он стирает всю таблицу параметров продукта перед вставкой новых данных...
Мне нужно разработать поддержку для стороннего модуля опций продукта, который у меня есть, но пока - я думаю, я бы просто помешал ему удалить важный столбец в моей таблице опций продукта.
в product_option_value
таблица, у меня есть "product_option", "product_id", "количество" и т. д., и есть один столбец с именем "info", который я НЕ хочу стереть. Метод ниже:
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, изображение = 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....
Редактировать:
Итак, я удалил поле "primary_key" из INSERT... и не получил сообщений об ошибках при загрузке. Но когда я просматриваю товар с такими опциями, я получаю это сообщение в верхней части моей страницы:
Примечание: неопределенный индекс: имя в /httpdocs/ocart/catalog/model/catalog/product.php в строке 418 Примечание: неопределенный индекс: имя в /httpdocs/ocart/catalog/model/catalog/product.php в строке 418Notic... повторяется
2 ответа
Убедитесь, что я понимаю: вы хотите очистить значения от всех столбцов в таблице 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)
Я добавляю второй ответ, используя совершенно другой подход, который позволяет избежать проблем с SQL.
- Экспортируйте свою таблицу в виде текстового файла, разделенного запятыми. Вы можете сделать это с помощью phpmyadmin или MySQL Workbench.
- Откройте CSV в электронной таблице
- Очистите столбцы, которые вы хотите очистить.
- Сохранить как новый CSV
- Импортируйте CSV обратно в базу данных с помощью phpmyadmin, Workbench или
LOAD DATA LOCAL INFILE
синтаксис.