2010-07-30 6 views
0

Je crée un utilitaire PHP qui importe et analyse un fichier CSV en $data, et si oui ou non INSERT "nouvelles" lignes dans la base de données ($saveNew).INSERT nouvelles lignes, UPDATE anciennes lignes: comment?

En ce moment, j'ai un peu d'un désordre laid: (en pseudo-PHP généralisée)

function synchronize($data,$saveNew) { 
    $existing_ids = $table->find_all('ID'); //array of ID's in the table 
    $incoming_ids = get_key('ID',$data); //grabs the ID field from each record 
    $new_ids = array_diff($incoming_ids,$existing_ids); 

    foreach ($data as $record) { 
     if (in_array($record['ID'],$new_ids)) { //it's new 
      if ($saveNew) $table->insert($record); 
      else continue; 
     } else { 
      $table->update($record); 
     } 
    } 
} 

cela a juste moi, une odeur, et je pense que je pourrais y arriver en un seul requête, sauf que je ne suis pas familier avec SQL. J'utilise un simple ORM dans mon application, mais je peux facilement utiliser SQL directement.

Oh, et j'utilise MySQL.

Cela peut-il être fait avec une seule requête? Il semble que ce serait un problème commun avec une solution simple, mais je ne peux tout simplement pas comprendre.

Répondre

3

Jetez un oeil à la syntaxe de MySQL INSERT ... ON DUPLICATE KEY ..., ce qui vous permet de faire exactement cela: http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

Que vous souhaitiez mettre en œuvre que dans votre ORM ou dans ce sous-programme spécifique de la vôtre est à vous ...

+0

Cela ressemble beaucoup mieux, mais cela ne s'appliquerait-il pas si '$ saveNew' est vrai? Si nous voulons synchroniser ($ data, false), alors nous ne voulons pas du tout INSERT. Existe-t-il une chose telle que "UPDATE IF EXISTS"? –

+0

Il n'y a pas besoin de 'UPDATE IF EXISTS' ... quand vous appelez' UPDATE ... WHERE id = 5', si l'id '5' n'existe pas, cela ne mettra rien à jour ... Aucune erreur , juste pas de mises à jour ... – ircmaxell

+0

@ircmaxwell: Oh wow, parle d'un "duh!" moment pour moi. Je ne pense apparemment pas très bien ...: D –

0

Si vous avez un identifiant de ligne unique, vous pouvez utiliser la syntaxe INSERT ... ON DUPLICATE KEY UPDATE:

INSERT INTO foo (id, col1, col2) VALUES (?, ?, ?) 
    ON DUPLICATE KEY UPDATE col1 = VALUES(col1), col2 = VALUES(col2); 

Ensuite, lorsque vous liez NULL, 4, 5 il va insérer une nouvelle ligne (en supposant id est un colonne utoincrement)

Lorsque vous liez 1, 4, 5 il va insérer une nouvelle ligne s'il n'y a pas de ligne 1, sinon il va mettre à jour la ligne 1 et de col1col2 champs à 4 et 5 respectivement ...

Questions connexes