2010-10-22 23 views
2

Je suis assez nouveau à ce désolé pour mon manque de connaissances.Perl MySQL - Comment passer la mise à jour ou l'insertion d'une ligne si un champ particulier correspond?

J'ai mis en place quelques tables avec lesquelles j'ai réussi à écrire et j'ai accédé via un script Perl en utilisant les modules CGI et DBI grâce aux conseils ici.

Ceci est une liste de membres pour un bulletin de nouvelles local. Oui, je sais, des tonnes d'applications là-bas, mais je veux apprendre cela.

1- Je voulais éviter de mettre à jour ou d'insérer une ligne si une partie de mon entrée correspond à des données de colonne dans une colonne/un champ particulier. Lors de la création de la table, dans phpmyadmin, j'ai cliqué sur le "U" (unique) sur le nom de cette colonne en mode Structure. Cela a semblé fonctionner et aucun dupes n'est inséré mais, je désire une solution de Perl codée dur ainsi, je comprends la mécanique de ceci. J'ai lu sur "insérer ignorer"/"mettre à jour ignorer" et cherché partout mais, tout ce que j'ai trouvé ne semble pas juste sauter une dupe.

La colonne n'est pas une clé ou autoinc juste un ancien champ avec une adresse e-mail. (erreur?)

2- Lorsque j'écris dans la base de données, je ne veux rien faire si l'adresse e-mail entrante correspond à une adresse dans ce champ. Je souhaite la méthode la plus rapide pour que je puisse passer en revue leurs données existantes d'exportation de listes, (elles ne peuvent pas comprendre le logiciel) sans des courses/verrouillage ou n'importe quelles conditions dans lesquelles je suis dans l'ignorance évidente.

Puisque je crée ceci à partir de zéro, 1 et 2 peuvent être en fait partiellement discutables. Si oui, quelle serait la meilleure approche?

Je voudrais toujours un ID d'incrémentation automatique, donc je peux accéder via le numéro d'ID ou la boucle à travers avec une sorte de count ++ foreach. Mon approche de couteau de pierre peut être risible pour les gourous ici, mais je dois commencer quelque part.

Merci d'avance pour votre aide.

Répondre

1

Avec la colonne d'adresse électronique déclarée UNIQUE, INSERT IGNORE est exactement ce que vous voulez insérer. On dirait que vous savez déjà comment faire la bonne chose!

(Vous pouvez exécuter la fonctionnalité "ne pas insérer si elle existe déjà" dans Perl, mais il est difficile de l'obtenir correctement, car vous devez envelopper le test et mettre à jour dans une transaction. base de données relationnelle est qu'il effectuera des contrôles de contraintes comme celui-ci pour vous, assurant l'intégrité des données même si votre application est boguée.)

Pour la mise à jour, je ne suis pas sûr de savoir à quoi ressemblerait une "mise à jour ignorer". Que se passe-t-il dans la clause WHERE qui limite votre UPDATE pour affecter uniquement la ligne souhaitée? Peut-être que la clé primaire auto_increment que vous avez mentionnée?Si vous êtes désireux d'écrire, par exemple,

UPDATE members SET firstname='Sue' WHERE member_id = 5; 

alors je pense que cette « mise à jour ignorer » la fonctionnalité que vous voulez peut-être juste quelque chose comme

UPDATE members SET firstname='Sue' WHERE member_id = 5 
    AND email != '[email protected]'; 

qui est une chose étrange à faire, mais c'est ma meilleure estimation pour ce que vous pourriez vouloir dire :)

+0

Merci! J'ai accepté votre réponse. – DulcimerDude

1

Il suffit de faire l'insertion, si les données rendraient la colonne unique non unique, vous obtiendrez une erreur SQL, vous devriez être capable de piéger ceci et faire tout ce qui est approprié (par exemple, l'ignorer, l'enregistrer, alerter l'utilisateur. ..)