J'ai une table avec 3 colonnes - id (pk), pageId (fk), nom. J'ai un script php qui déverse environ 5000 enregistrements dans la table, avec environ la moitié étant des doublons, avec le même pageId et le même nom. La combinaison de pageId et de nom doit être unique. Quel est le meilleur moyen d'empêcher les doublons d'être sauvegardés dans la table lorsque je boucle le script en php?Meilleure façon d'éviter l'entrée en double dans la base de données mysql
Répondre
La première étape serait de définir une clé unique sur la table:
ALTER TABLE thetable ADD UNIQUE INDEX(pageid, name);
Ensuite, vous devez décider ce que vous voulez faire quand il y a un double. Si vous:
l'ignorer?
INSERT IGNORE INTO thetable (pageid, name) VALUES (1, "foo"), (1, "foo");
Remplacer l'enregistrement saisi précédemment?
INSERT INTO thetable (pageid, name, somefield) VALUES (1, "foo", "first") ON DUPLICATE KEY UPDATE (somefield = 'first') INSERT INTO thetable (pageid, name, somefield) VALUES (1, "foo", "second") ON DUPLICATE KEY UPDATE (somefield = 'second')
Mettre à jour un compteur?
INSERT INTO thetable (pageid, name) VALUES (1, "foo"), (1, "foo") ON DUPLICATE KEY UPDATE (pagecount = pagecount + 1)
Vous pouvez définir le PageID et le Nom sur un index Unique dans la base de données MySQL. De cette façon, lorsque vous insérez les lignes, cela provoque une erreur, qui peut être ignorée par PHP, et vous pouvez simplement passer à la ligne suivante.
Cela suppose que vous insérez des lignes individuellement. Alias:
foreach($large_data as $fields)
{
mysql_query("INSERT INTO TABLE (`Something`) VALUES('".$fields['something']."');
}
Intentionnellement permettant mysql_query() pour lancer des avertissements PHP lorsque vous appuyez sur les lignes en double est une sorte de désordre (il encombre votre journal, il est des ressources relativement intensive, etc.). Surtout quand les empêcher en premier lieu est aussi simple que d'utiliser la fonction 'INSERT IGNORE' de MySQL mentionnée dans d'autres solutions. En outre, l'insertion dans une boucle est inefficace lorsque la syntaxe d'insertion en bloc est disponible. –
D'un point de MySQL, vous pouvez le faire
alter table YOURTABLE add unique index(pageId, name);
Si votre texte est correct et que vous voulez faire de php vous pouvez faire
$already_done = array();
foreach ($records as $record)
{
$unique_hash = md5($record['name'].$record['pageId']);
if (!in_array($unique_hash, $already_done))
{
$already_done[] = $unique_hash;
// sql insert here
}
}
de toute façon ceux-ci devraient Est-ce que vous allez bien?
Bien sûr, s'il y a déjà des enregistrements dans la table * avant * le démarrage du script, ceux-ci n'apparaîtront pas dans '$ already_done'. –
Vous pouvez également ignorer l'erreur avec mysql: INSERT IGNORE INTO TABLE ... il ignorera l'erreur de clé, passera au-dessus de cet insert et passera au suivant.
- 1. Quelle est la meilleure façon de convertir une base de données mysql en une base sqlite?
- 2. Quelle est la meilleure façon de stocker des données html dans une base de données mysql?
- 3. La meilleure façon de vérifier l'utilisateur existant dans la base de données mySQL?
- 4. meilleure façon d'importer des données dans MySQL
- 5. Suppression d'entrées en double d'une base de données Mysql
- 6. Trouver des chaînes en double dans la base de données
- 7. Quelle est la meilleure façon d'implémenter le versioning dans une base de données MYSQL?
- 8. Meilleure façon de synchroniser la base de données client avec la base de données du serveur
- 9. Quelle est la meilleure méthode pour arrêter les insertions en double dans la base de données
- 10. Rechercher dans la base de données MySQL
- 11. Meilleure façon de stocker un python time.struct_time dans une base de données mysql
- 12. Quelle est la meilleure façon de migrer une base de données Django de SQLite à MySQL?
- 13. Une meilleure façon de stocker de gros fichiers dans une base de données MySQL?
- 14. quelle est la meilleure façon d'éviter l'injection sql dans mysql
- 15. Comment vérifier l'entrée en double dans la base de données?
- 16. Comptage d'entrées en double dans la base de données
- 17. La meilleure façon de stocker vues/stats dans MySQL
- 18. Meilleure façon d'apprendre MySQL
- 19. Quelle est la meilleure façon de comparer Double et Int?
- 20. Vérification PHP/MySQL pour le contenu en double dans la base de données
- 21. Quelle est la meilleure façon de naviguer dans les définitions de balises en double dans Emacs?
- 22. mysql suppression de données en double
- 23. Meilleure façon de créer un point de terminaison SPARQL pour un SGBDR (base de données MySQL)
- 24. Quelle est la meilleure façon de représenter les feuilles de temps dans la base de données
- 25. La meilleure façon d'extraire des données d'une base de données FileMaker Pro dans un script?
- 26. Données de base - Meilleure façon d'enregistrer un "nombre d'éléments"
- 27. quelle est la meilleure façon d'apprendre la connectivité de base de données dans .net
- 28. Base de données Wordpress dans la base de données MySQL?
- 29. Meilleure façon de supprimer des entrées en double d'une table de données
- 30. La meilleure façon de stocker ces données dans SQL Table
GRAND merci, c'était une excellente réponse à une question que j'ai étudiée depuis quelque temps ici sur Stack Overlow. – capfu