2008-11-09 11 views

Répondre

9

Vous souhaitez probablement créer une contrainte "UNIQUE" sur le champ "Domaine" - cette contrainte génère une erreur si vous créez deux lignes ayant le même domaine dans la base de données. Pour une explication, voir this tutorial in W3C school -

http://www.w3schools.com/sql/sql_unique.asp

Si cela ne résout pas votre problème, s'il vous plaît clarifier la base de données que vous avez choisi d'utiliser (MySql?). REMARQUE: Cette contrainte est complètement distincte de votre choix de PHP en tant que langage de programmation, c'est une chose de définition de base de données SQL. Un énorme avantage de l'expression de cette contrainte dans SQL est que vous pouvez faire confiance à la base de données pour préserver la contrainte même lorsque des personnes importent/exportent des données de la base de données, votre application est boguée ou une autre partage la base de données.

0

Je ne suis pas vraiment sûr d'avoir compris votre question, mais peut-être cherchez-vous le "UNIQUE" constraint de SQL. Si la requête tente d'insérer une valeur préexistante dans un champ, vous (PHP) serez averti de cette violation de contrainte.

0

Il y a plusieurs façons d'aborder cela. Vous pouvez définir une contrainte unique (comme une clé primaire) sur cette colonne. Cela entraînera l'échec de l'insertion si ce domaine a également été inséré. Vous pouvez également insérer tous les domaines en double et les supprimer plus tard. Cela fonctionnera bien si pas beaucoup de domaines sont dupliqués. Il existe déjà quelques questions sur la recherche de doublons.

1

S'il s'agit d'une exigence absolue d'intégrité de la base de données (elle ne changera probablement pas et que les données existantes ne présentent pas ce problème), je l'appliquerai à la base de données avec une contrainte unique.

En ce qui concerne la détection avant ou après la tentative afin de notifier l'utilisateur, il existe un certain nombre de techniques qui pourraient être utilisées.

0

Cela peut être fait avec sql, plutôt qu'avec php. Je suppose que vous utilisez MySQl, mais les mêmes principes fonctionneront avec différentes bases de données.

rend la colonne Domaine la clé primaire. (logique, car il doit unique.)

Plutôt que d'utiliser INSERT, utilisez UPDATE.

Si la clé primaire existe déjà (que vous essayez de mettre dans la table), update mettra à jour le tuple existant, plutôt que de créer un nouveau tuple. Ainsi, vous écraserez les données existantes si elles sont différentes et si elles sont identiques, la mise à jour sera ignorée.

1

D'où proviennent les données? Est-ce quelque chose que vous ne voulez exécuter qu'une seule fois, ou plusieurs fois, ou souvent? Si la valeur du domaine existe déjà, voulez-vous simplement ignorer l'insertion ou faire autre chose (par exemple incrémenter un compteur)?

En fonction de vos réponses, il existe de nombreuses solutions possibles:

  1. de trier vos données, éliminer les doublons, puis insérez (en supposant que les données relativement statiques, table vide pour commencer)

  2. Utiliser un tableau associatif dans PHP comme cache de valeur de domaine local (si le tableau contient déjà des données, commencez par lire le contenu existant; non thread-safe, mais fonctionne s'il s'exécute uniquement une fois à la fois)

  3. Marque domaine une colonne et code wrapper écrire pour gérer renvoyer des erreurs

  4. Marque domaine une colonne UNIQUE ou PRIMARY KEY et utiliser une clause KEY Duplicate UNIQUE: INSERT INTO mydata (domaine, compte) VALEURS (' firstdomain', 1), ('seconddomain', 1), ('thirddomain', 1) sur le nombre DUPLICATE KEY UPDATE = count + 1

  5. Insérer toutes les données dans la table, puis supprimer les doublons

Notez que les insertions de traitement par lots (c'est-à-dire en utilisant des clauses à valeurs multiples par instruction) peuvent être considérablement plus rapides.

Questions connexes