2010-06-14 5 views
7

Voilà ma table avec quelques exemples de donnéesMySQL INSERT IGNORE ne fonctionne pas

a_id | b_id 
------------ 
    1 225 
    2 494 
    3 589 

Quand je lance cette requête

INSERT IGNORE INTO table_name (a_id, b_id) VALUES ('4', '230') ('2', '494') 

Il insère ces deux lignes quand il est censé ignorer la seconde paire de valeurs (2, 494)

Aucun index défini, aucune de ces colonnes n'est primaire.

Qu'est-ce que je ne connais pas?

Répondre

13

De l'docs:

Si vous utilisez le mot-clé IGNORE, les erreurs qui se produisent lors de l'exécution de l'instruction INSERT sont traités comme des avertissements au lieu. 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 abandonnée. Avec IGNORE, la ligne n'est toujours pas insérée, mais aucune erreur n'est émise.

(mon italique).

Votre ligne ne duplique pas "un index UNIQUE existant ou une valeur PRIMARY KEY" car vous n'avez aucune clé primaire ni aucune contrainte unique.


Si, comme vous le mentionnez dans un de vos commentaires, vous voulez ni champ soit unique mais vous ne veulent la combinaison soit unique, vous avez besoin d'une clé primaire composite à travers les deux colonnes (se débarrasser de les doublons en premier):

alter table MYTABLE add primary key (a_id,b_id) 
1

S'il n'y a pas de clé primaire, il ne peut pas y avoir de clé en double à ignorer. vous devriez toujours définir une clé primaire, donc faites-le - et si vous voulez avoir des colonnes supplémentaires qui ne devraient pas être dupliquées, placez-les comme "uniques".

+0

Hmm ... alors comment ignorer une ligne dupliquée sans avoir besoin d'une clé primaire? Et je ne veux pas définir une colonne particulière comme unique. Je veux que la combinaison des deux colonnes soit unique. Par exemple, il peut y avoir une ligne (3, 589) et une ligne (3, 330) mais il ne peut y en avoir deux (3, 589) s – HyderA

+0

Vous devez utiliser une contrainte unique multi-colonne. Exemple déjà fourni par paxdiablo. Cela répondra à vos besoins.Vous DEVEZ avoir une contrainte unique si vous voulez que MySQL gère votre requête IGNORE. – Fenton

3

Si vous ne définissez pas de critère UNIQUE ou si vous définissez un PRIMARY KEY, MySql ne saura pas que votre nouvelle entrée est un doublon.

0

Si je vous comprends bien, après avoir exécuté la commande d'insertion de votre table ressemble à ceci

1 225 
2 494 
3 589 
4 230 
2 494 

Si oui, alors la réponse est parce que votre conception de table permet des doublons. Si vous voulez empêcher l'insertion du second enregistrement, vous devez définir la colonne a_id comme une clé primaire, ou un index unique. Si vous le faites, l'instruction insert ignore fonctionnera comme vous le souhaitez, c'est-à-dire, insérez les enregistrements, ignorez les erreurs telles que la tentative d'ajout d'un enregistrement en double.