2010-11-14 35 views
1

Je travaille avec une base de données MySQL et j'ai besoin de vérifier si une ligne est déjà là avant de décider quelles requêtes exécuter.Comment vérifier si une ligne de base de données existe en utilisant DBD :: mysql et Perl?

Le tableau que je travaille sur est quelque chose comme ceci:

player(playerid, nickname, data1, data2, data3) 

Où « playerid » est un numéro auto-incrémentée et « surnom » est unique.

J'ai essayé quelques requêtes avec COUNT, COALESCE, fetch-> rows, etc. et n'ai obtenu nulle part. J'ai déjà vu this question, mais je n'ai rien pu résoudre.

+0

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html doesn ne t'aide pas? – khachik

+0

Peut-être mon plus grand ennui avec SQL est son manque d'une commande (standard) signifiant "juste mettre ceci dans la base de données et je m'en fiche si elle INSERT une nouvelle ligne ou UPDATEs une existante" de sorte que vous ne devez pas faites la danse "si SELECT puis UPDATE else INSERT". Il y a beaucoup de cas où il est important que vous insériez ou mettez à jour, ainsi le modèle actuel a certainement ses utilisations, mais elles sont, dans mon expérience, l'exception plutôt que la règle. (La syntaxe "INSERT ... ON DUPLICATE" de MySQL ne répond pas non plus à cette question, car vous devez gérer séparément les commandes INSERT et UPDATE.) –

+0

@khachik: Il ne s'agissait pas simplement d'INSERT ou de UPDATE, cela a également influencé le code Perl qui allait être exécuté. Merci quand même pour la référence! – Gurzo

Répondre

5

Pourriez-vous s'il vous plaît poste la requête spécifique avec SELECT COUNT(*) qui ne fonctionnait pas et quel était le problème?

La requête doit être calqué sur cette réponse: How do I know how many rows a Perl DBI query returns?

En supposant que votre « ligne est déjà là » définition est « le joueur avec le surnom donné est là », la requête serait:

my $th = $dbh->prepare(qq{SELECT COUNT(1) FROM player WHERE nickname='$nickname'}); 
$th->execute(); 
if ($th->fetch()->[0]) { 
    .... 
} # Code stolen shamelessly from the link above 
+0

Cela fonctionne. J'ai utilisé $ th-> fetch() en faisant référence à la question liée, donc c'était probablement ceci. Merci. – Gurzo

+0

Pourquoi le vote négatif? – DVK

+0

Si quelqu'un vous a rabaissé, ce n'était pas moi. En fait, je vous ai voté. – Gurzo

0

Vous pouvez utiliser une méthode dHP/STH pour vérifier si le jeu de résultats est vide:

my $stmt = 'SELECT playerid FROM player WHERE playerid = ?'; 

if ($dbh->selectrow_array($stmt, undef, $id)) { 
    print "The row exists"; 
}