如果数据存在,如何执行更新查询,否则在Mysql中插入数据?

时间:2012-04-20 13:52:55

标签: php mysql insert insert-update

我想知道如果数据存在则必须有mysql更新查询,否则将数据插入mysql表。

我所做的是,我使用 fgetcsv()函数将.csv文件中的数据提取到mysql中。 然后从csv&读取每一行将这四个值放在四个变量和&然后激发更新查询。 那我如何检查如果其中一个数据不存在仍然更新查询正在工作(0行成功更新)所以我想识别该数据& 插入表格,如果数据显示我的更新查询将有效。

我想要将数据更新或插入到product_entity_price表中。 我的剧本 - :

    if(($handle = fopen("/data/sample/items_0420.csv", "r")) !== FALSE) 
    {          
         while (($data = fgetcsv($handle, 8000, ",")) !== FALSE)      
         {
        $num = count($data);
        for ($c=0; $c < $num; $c++) 
        {             
            $temp = $data;             
            $string = implode(";", $temp);           
        }
            $pieces = explode(";", $string);               
            $col1 = $pieces[0];
            $col2 = $pieces[1];         
            $col3 = $pieces[2];               
            $col4 = $pieces[3]; 

    $query_insert = "INSERT INTO import_prices (customer_id, sku, price, website) ".             
    "VALUES($col1,'$col2',$col3,'$col4') ".             
    "ON DUPLICATE KEY UPDATE customer_id=$col1, price=$col3,website='$col4' "; 
        $result = mysql_query($query_insert);

             $query_update = "UPDATE  product_entity_price pep 
             JOIN   catalog_product cp   ON    cp.entity_id = pep.entity_id    
             AND    cp.sku LIKE '$col2'   AND   website_id = $col4 
             JOIN   customer_group cg   ON    cg.customer_group_id = pep.customer_group_id   AND   cg.customer_group_code =  $col1 
SET cpetp.value = ".$col3.";";
             mysql_query($query_update);
          }
    }

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

我认为你想要的是MySQL UPSERT,也称为INSERT...ON DUPLICATE KEY UPDATE

答案 2 :(得分:1)

如果你不在乎如果一行被删除,如果重复并再次插入则可以使用REPLACE

REPLACE into table (col1, col2) values(val1, val2)

答案 3 :(得分:1)

我总是发现使用两个查询是可靠

$result = mysql_query("SELECT 1 FROM import_prices WHERE ...");
list($exists) = mysql_fetch_row($result);

if ($exists)
    $result = mysql_query("UPDATE import_prices ...");
else
    $result = mysql_query("INSERT INTO import_prices ...");

这种方法的缺点是你总是会做两个查询而不是一个。但是这种方法适用于没有主键的表,比如关系表。

您也可以尝试执行更新查询,然后检查mysql_affected_rows并插入是否为0,但是会被警告:如果您执行更新并且所有旧值都是与新值相同,mysql_affected_rows仍将返回0.