0

所以我有一个用于 OpenCart 的导入/导出模块,但它在插入新数据之前会擦除整个产品选项表......

我需要开发对我拥有的第 3 方产品选项模块的支持,但与此同时——我想我会阻止它删除我的产品选项表中的一个重要列。

product_option_value表中,我有“product_option”、“product_id”、“quantity”等,并且有一个名为“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";

谢谢!

编辑:

我尝试了 Michael 的建议来使用UPDATE并明确将它们全部设置为 NULL ......但这返回了这个错误:

错误:键 1 的重复条目“0”错误编号:1062 更新 oc_product_option_value设置 product_option_value_id=NULL,product_option_id=NULL,product_id=NULL,quantity=NULL,subtract=NULL,price=NULL,prefix=NULL,sort_order=NULL,weight=空,sku=空,图像=空

我尝试取出主键:

$sql .= "UPDATE ".DB_PREFIX."product_option_value SET product_option_id=NULL,product_id=NULL,quantity=NULL,subtract=NULL,price=NULL,prefix=NULL,sort_order=NULL,weight=NULL;\n";

但我得到:

错误:密钥 1 的重复条目“1”错误编号:1062 INSERT INTO `oc_product....

编辑:

好的,所以我从 INSERT 中删除了“primary_key”字段......并且上传时没有收到错误消息。但是,当我查看产品选项的产品时,我会在页面顶部收到以下消息:

注意:未定义索引:第 418 行 /httpdocs/ocart/catalog/model/catalog/product.php 中的名称注意:未定义索引:第 418 行 /httpdocs/ocart/catalog/model/catalog/product.php 中的名称注意... . 它重复

4

2 回答 2

2

确保我理解:您要清除表中product_option_value除列之外的所有列的值info吗?如果这就是您想要的,那么以下可能会起作用。在我们清楚您要做什么之前,请不要运行它!

DELETE FROM语法意味着从表名中删除,而不是从列名中删除。相反,您需要做的是UPDATE在行中设置所有列,除了您打算保留为NULL空或默认值的列。

WHERE如果您需要保留某些行而不修改它们,请不要忘记添加条件!如果没有WHERE,此查询将 NULL 出整个表中指定的所有列。

UPDATE product_option_value
SET 
  product_option = NULL,
  product_id = NULL,
  quantity = NULL,
  etc...
WHERE (some where condition if you need one)
于 2011-03-31T13:57:56.050 回答
0

我正在添加第二个答案,采用完全不同的方法来避免 SQL 问题。

  1. 将表格导出为逗号分隔的文本文件。您可以使用 phpmyadmin 或 MySQL Workbench 执行此操作。
  2. 在电子表格中打开 CSV
  3. 清除要清除的列。
  4. 另存为新的 CSV
  5. LOAD DATA LOCAL INFILE使用 phpmyadmin、Workbench 或语法将 CSV 导入回您的数据库。
于 2011-03-31T14:55:13.510 回答