2015-05-02 3 views
0

У меня есть таблица MySQL со следующими полями:Состояние управляемой INSERT и UPDATE в одном запросе

  1. ID
  2. ТЕЛЕФОН
  3. ИМЯ
  4. ГОРОД
  5. СТРАНА

Используя PHP, я читаю запятую дамп значений из текстового документа, анализируя значения и вставки записей в таблицу. Для справки, вот код:

<?php 

    // Includes 
     require_once 'PROJdbconn.php'; 

    // Read comma-separated text file 
     $arrindx = 0; 
     $i = 0; 

     $filehandle = fopen(PROJCDUMPPATH.PROJCDUMPNAME,"rb"); 
     while (!feof($filehandle)){ 
      $parts = explode(',', fgets($filehandle)); 
      $contnames[$arrindx] = $parts['0']; 
      $contnumbers[$arrindx] = preg_replace('/[^0-9]/','',$parts['1']); 
      $arrindx += 1; 
     } 
     fclose($filehandle); 
     $arrindx -= 1; 
     $filehandle = NULL; 
     $parts = NULL; 

    // Build SQL query 
     $sql = "INSERT INTO Contact_table (PHONE, NAME) VALUES "; 
     for ($i = 0; $i < $arrindx; ++$i){ 
      $sql .= "('".$contnumbers[$i]."', '".$contnames[$i]."'),"; 
     } 
     $i = NULL; 
     $arrindx = NULL; 
     $contnames = NULL; 
     $contnumbers = NULL; 
     $sql = substr($sql,0,strlen($sql)-1).";"; 

    // Connect to MySQL database 
     $connect = dbconn(PROJHOST,PROJDB,PROJDBUSER,PROJDBPWD); 

    // Execute SQL query 
     $query = $connect->query($sql); 
     $sql = NULL; 
     $query = NULL; 

    // Close connection to MySQL database 
     $connect = NULL; 



    ?> 

Теперь этот код, как вы можете видеть, слепо отвалы всех записей в таблицу. Тем не менее, мне нужно изменить логику кода, как например:

Read text file and parse records into arrays (already doing) 
For each record in text file 
    Check if PHONE exists in the table 
    If yes, 
     For each field in the text file record 
      If text file field != NULL 
       Update corresponding field in table 
      Else 
       Skip 
    If no, 
     INSERT record (already doing) 

Я извиняюсь, если логика не очень понятно, не стесняйтесь спрашивать меня, если какой-либо аспект вас смущает. Итак, я понимаю, что эта логика будет включать безумное количество запросов SELECT, UPDATE и INSERT, в зависимости от количества полей (я собираюсь добавить больше полей в будущем) и записей. Есть ли способ каким-либо образом преобразовать их в один запрос или по меньшей мере оптимизировать код, минимизируя количество запросов?

+1

Я думаю, вы должны взглянуть на MySQL документации для INSERT - особенно пункта "ON KEY UPDATE DUPLICATE". Конечно, если вы его используете, вам нужно сделать номер телефона уникальным. –

+0

Я действительно рассматривал метод ON DUPLICATE KEY UPDATE. Тем не менее, мне нужно запустить условие на отдельных полях в записи, которая была дублирована. Только те поля должны быть обновлены, если у меня есть значение NON-NULL. Например, если запись уже существует для телефона 123456, я бы не захотел перезаписать всю запись; только те поля, где у меня есть реальная ценность, чтобы заменить его. – TheLearner

ответ

Смежные вопросы