2011-03-31 54 views
0

所以,我对于Opencart的导入/导出模块,但它抹在整个产品选项表中插入新的数据之前...如何从表中删除所有内容,除了MySQL中的1项外?

我需要开发第三方产品选择模块我有支持,但在同时 - 我想我会阻止它删除我的产品选项表中的重要列。

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"; 

谢谢!

编辑:

我想迈克尔的使用UPDATE并明确建议他们都设置为NULL ......但返回此错误:

Error: Duplicate entry '0' for key 1 Error No: 1062 UPDATE oc_product_option_value SET product_option_value_id=NULL, product_option_id=NULL, product_id=NULL, quantity=NULL, subtract=NULL, price=NULL, prefix=NULL, sort_order=NULL, weight=NULL, sku=NULL, image=NULL

我试图取出主键:

$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";

,但我得到:

Error: Duplicate entry '1' for key 1 Error No: 1062 INSERT INTO `oc_product....

编辑:

好了,所以我删除了从插入了“primary_key”字段...和我从上传任何错误消息。但是,当我看到一个产品,产品的选择,我得到这个消息,我的网页的顶部:

Notice: Undefined index: name in /httpdocs/ocart/catalog/model/catalog/product.php on line 418Notice: Undefined index: name in /httpdocs/ocart/catalog/model/catalog/product.php on line 418Notic.... it repeats

+0

查询有什么问题。似乎对我很好。 – Nishant 2011-03-31 13:53:32

+0

最后的陈述是正确的。 – Emmerman 2011-03-31 13:56:34

+0

好吧,就这样做....你可能需要'<>'而不是'!='。在手册中查找MySQL操作符语法。 – 2011-03-31 14:03:21

回答

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) 
+0

@Michael - 用我得到的错误消息更新了我的问题... – jlmakes 2011-03-31 14:17:26

+0

可能因为您设置了'product_option_id = NULL,product_id = NULL'。您无法覆盖表格的主键字段。那些将不得不保持原样,以及相关的“信息”列。如果您不知道关键字段,请使用'DESCRIBE product_option_value;'来查找它们。然后重新运行您的'UPDATE'语句而不使用键列的NULL。 – 2011-03-31 14:31:35

+0

@Michael - 我试图从查询中删除主键字段(product_option_value_id),并且我收到了类似的错误消息。见上面... – jlmakes 2011-03-31 14:40:52

0

我添加了第二个答案,采取了一种完全不同的方法来避免SQL问题。

  1. 将表格导出为逗号分隔文本文件。您可以使用phpmyadmin或MySQL Workbench来完成此操作。
  2. 在电子表格中打开您的CSV
  3. 清除您要清除的列。
  4. 另存为新的CSV
  5. 使用phpmyadmin,Workbench或LOAD DATA LOCAL INFILE语法将CSV导回到数据库中。
+0

这是Opencart的第三方导入/导出扩展。我试图修改代码,以便它不擦除由另一个第三方扩展创建的另一列。我需要修改每个导入/导出代码,而不仅仅是一次性交易:/ – jlmakes 2011-03-31 14:58:34

相关问题