Как выполнить любой запрос на обновление, если данные присутствуют, иначе вставьте данные в Mysql?

Я хотел знать, если данные присутствуют, должен быть запрос на обновление mysql, иначе вставьте данные в таблицу mysql.

Что я сделал, так это извлекаю данные из файла .csv в mysql, используя функцию fgetcsv(). Затем читаем каждую строку из csv и помещаем эти четыре значения в четыре переменные, а затем запускаем запрос на обновление. Итак, как я могу проверить, что, если один из данных отсутствует, все еще работает запрос обновления (0 строк успешно обновлено), поэтому я хочу идентифицировать эти данные и вставить их в таблицу, если данные представляют мой < strong>обновить запрос будет работать.

Я хочу обновить или вставить данные в таблицу 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);
          }
    }

person Prat    schedule 20.04.2012    source источник
comment
INSERT INTO ... ON DUPLICATE KEY UPDATE уже должен это сделать. Есть ошибки?   -  person CodeCaster    schedule 20.04.2012
comment
У вас есть уникальный ключ в вашей таблице import_prices?   -  person Travesty3    schedule 20.04.2012
comment
HI CodeCaster, INSERT INTO... ON DUPLICATE KEY UPDATE работает нормально... но я хочу либо обновить, либо вставить в другую таблицу product_entity_price...& мы используем ON DUPLICATE KEY UPDATE для некоторых ограничений, таких как уникальный ключ или первичный ключ.. .но в product_entity_price нет уникального ключа...   -  person Prat    schedule 20.04.2012
comment
HI Travety3, ранее в import_prices был уникальный ключ, т.е. sku. но теперь доступно несколько артикулов, поэтому удалите это ограничение... так что теперь нет уникального ключа в import_prices.   -  person Prat    schedule 20.04.2012
comment
Если у вас нет уникального ключа в import_prices, как MySQL узнает, когда переходить с INSERT на UPDATE? Что означает DUPLICATE? Посмотрите, поможет ли мой ответ ниже для этого.   -  person Travesty3    schedule 20.04.2012


Ответы (4)


Проверьте замену команды mysql:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

person Estragon    schedule 20.04.2012

Я думаю, вам нужен MySQL UPSERT, также известный как ВСТАВИТЬ... ПРИ ОБНОВЛЕНИИ ДУБЛИКАЦИИ КЛЮЧА.

person Jeremy Holovacs    schedule 20.04.2012
comment
Это все еще правильный ответ. Проверка ключей была бы полезной. - person Jeremy Holovacs; 20.04.2012

Если вам все равно, удаляется ли строка, если она дублируется и вставляется снова, вы можете использовать ЗАМЕНИТЬ

REPLACE into table (col1, col2) values(val1, val2)
person juergen d    schedule 20.04.2012
comment
Будьте осторожны с этим, если у вас много строк для вставки/обновления. code.openark.org/blog/mysql/replace-into-think- дважды - person SupremeDud; 20.04.2012

Я всегда считал наиболее надежным использование двух запросов:

$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.

person Travesty3    schedule 20.04.2012