80 votes

MySQL - ignorez l'erreur d'insertion : entrée dupliquée

Je travaille en PHP.

Quelle est la bonne façon d'insérer de nouveaux enregistrements dans la base de données, qui a un champ unique ? J'insère beaucoup d'enregistrements dans un lot et je veux juste que les nouveaux soient insérés et je ne veux pas d'erreur pour l'entrée en double.

Existe-t-il un seul moyen de faire d'abord un SELECT et de voir si l'entrée est déjà là avant l'INSERT - et de n'effectuer l'INSERT que lorsque le SELECT ne renvoie aucun enregistrement ? J'espère que non.

Je voudrais d'une manière ou d'une autre dire à MySQL d'ignorer ces insertions sans aucune erreur.

Merci.

0 votes

Insert ignore fonctionne pour moi Le problème que j'ai est que certaines lignes sont supprimées de la table et j'essaie d'insérer les lignes de même id qui ont été supprimées précédemment dans ce cas l'instruction "insert ignore" a fonctionné.

177voto

zombat Points 46702

Vous pouvez utiliser INSÉRER... IGNORER syntaxe si vous voulez ne prendre aucune mesure lorsqu'il y a un enregistrement en double.

Vous pouvez utiliser REMPLACER DANS syntaxe si vous voulez écraser un ancien enregistrement avec un nouveau avec la même clé.

Ou bien, vous pouvez utiliser INSERT... SUR LA MISE À JOUR DES CLÉS DUPLIQUÉES syntaxe si vous souhaitez plutôt effectuer une mise à jour de l'enregistrement lorsque vous rencontrez un doublon.

Edit : J'ai pensé ajouter quelques exemples.

Exemples

Disons que vous avez une table nommée tbl avec deux colonnes, id y value . Il y a une entrée, id=1 et value=1. Si vous exécutez les instructions suivantes :

REPLACE INTO tbl VALUES(1,50);

Vous avez toujours un enregistrement, avec id=1 valeur=50. Notez que l'enregistrement entier a d'abord été SUPPRIMÉ, puis réinséré. Ensuite :

INSERT IGNORE INTO tbl VALUES (1,10);

L'opération s'exécute avec succès, mais rien n'est inséré. Vous avez toujours id=1 et value=50. Enfin :

INSERT INTO tbl VALUES (1,200) ON DUPLICATE KEY UPDATE value=200;

Vous avez maintenant un seul enregistrement avec id=1 et value=200.

9 votes

"Si vous utilisez le mot-clé IGNORE, les erreurs qui se produisent pendant l'exécution de l'instruction INSERT sont traitées comme des avertissements à la place". -Dans le lien d'insertion ci-dessus

2 votes

Les avertissements ne provoquent toutefois pas d'erreur, de sorte que votre script continuera à s'exécuter. Extrait du manuel : Si vous utilisez le mot-clé IGNORE, les erreurs qui se produisent pendant l'exécution de l'instruction INSERT sont traitées comme des avertissements à la place. Par exemple, sans IGNORE, une ligne qui duplique un index UNIQUE existant ou une valeur PRIMARY KEY dans la table provoque une erreur de clé dupliquée et l'instruction est interrompue. Avec IGNORE, la ligne n'est toujours pas insérée, mais aucune erreur n'est émise.

0 votes

IGNORE ignorera des erreurs qui n'ont peut-être rien à voir avec des clés dupliquées. Il est préférable de faire ON DUPLICATE KEY UPDATE field=field afin que vous puissiez attraper ces erreurs et, en prime, ne pas avoir d'avertissements.

-1voto

Benoit Points 39210

À quoi ressemble le schéma de la base de données ?

Vous pouvez ajouter une colonne d'identification qui incrément automatique pour chaque insertion, afin de garantir des rangs uniques.

-1voto

gehsekky Points 1287

Vous pouvez vous assurer que vous n'insérez pas d'informations en double en utilisant la condition EXISTS.

Par exemple, si vous avez une table nommée clients avec une clé primaire de client_id, vous pouvez utiliser l'instruction suivante :

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

Cette instruction insère plusieurs enregistrements avec une sous-sélection.

Si vous vouliez insérer un seul enregistrement, vous pourriez utiliser l'instruction suivante :

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

L'utilisation de la double table vous permet de saisir vos valeurs dans une instruction de sélection, même si les valeurs ne sont pas actuellement stockées dans une table.

de http://www.techonthenet.com/sql/insert.php

0 votes

Ce n'est pas la bonne façon de procéder. Cette solution est lente, plus difficile à maintenir et sujette à des erreurs. Utiliser INSERT avec IGNORE serait une bien meilleure solution.

0 votes

Cela semble être un joint cartésien, ce qui n'est pas conseillé dans cette circonstance.

-2voto

Kirtan Points 11022

Vous pouvez utiliser déclencheurs .

Vérifiez également ce guide d'introduction aux déclencheurs .

-3voto

Jordan S. Jones Points 7724

Essayez de créer une table dupliquée, de préférence une table temporaire, sans la contrainte unique et effectuez votre chargement en masse dans cette table. Ensuite, sélectionnez uniquement les éléments uniques (DISTINCT) dans la table temporaire et insérez-les dans la table cible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X