IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

INSERT IGNORE.. rien


Sujet :

Requêtes MySQL

  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut INSERT IGNORE.. rien
    Bonsoir,
    mon but est de n'insérer des valeurs que si celles-ci ne sont pas déjà présentes en bdd. J'ai fait pour cela un INSERT IGNOREINSERT IGNORE INTO `application` (application_name,platform,platform_owner,publisher) VALUES('APPLICATIONNAME','PLATFORM','SESA12345','PUBLISHER');Les valeurs insérées, c'est n'importe quoi, juste pour la mise au point.
    Et ben, si je lance une deuxième fois la requête, je m'attends à ce qu'elle soit ignorée. Et ben, non. Je me retrouve avec 2 enregistrements identiques dans ma table, à part l'identifiant qui a été auto-incrémenté.

    Voici la DDL de la table :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DROP TABLE IF EXISTS `application`;
    CREATE TABLE `application` (
      `application_key` smallint(2) NOT NULL AUTO_INCREMENT,
      `application_name` varchar(30) COLLATE utf8_bin NOT NULL DEFAULT '',
      `platform` varchar(30) COLLATE utf8_bin DEFAULT NULL,
      `platform_owner` varchar(30) COLLATE utf8_bin DEFAULT NULL,
      `publisher` varchar(30) COLLATE utf8_bin DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO `application` (`application_key`, `application_name`, `platform`, `platform_owner`, `publisher`) VALUES
    (4, 'APPLICATIONNAME', 'PLATFORM', 'SESA12345', 'PUBLISHER'),
    (5, 'APPLICATIONNAME', 'PLATFORM', 'SESA12345', 'PUBLISHER');

    Peut-on m'expliquer ce mystère et comment je peux faire pour atteindre mon objectif ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 371
    Par défaut
    Bonjour,
    La recherche du doublon se fait sur la clé primaire de la table, ou un(des) index(es) unique(s).
    Ici tu as bien une clé primaire, mais pas d'index unique.
    Si tu n'affectes pas de valeur à la clé primaire, et qu'en plus elle est auto-générée, tu n'as pas de doublon.
    D'ailleurs tu le dis toit même:
    Citation Envoyé par laurentSc Voir le message
    Bonsoir,
    Je me retrouve avec 2 enregistrements identiques dans ma table, à part l'identifiant qui a été auto-incrémenté.
    C'est même expliqué dans l'aide en ligne (en anglais ): .
    Si tu veux gérer l'unicité sur une autre colonne (ou plusieurs), il faut chercher les "doublons" manuellement, par exemple avec un NOT EXIST.

    Tatayo.

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    quand je t'ai lu, j'ai pensé que tu avais la solution. En fait, mon besoin exact est de faire : if not exists INSERT else UPDATE. Une petite recherche m'a montré que le mieux était l'instruction REPLACE, mais comme pour le INSERT IGNORE, ça ne marche que sur les clés primaires ou uniques. Dans ma table, il y a une seule colonne qui doit être unique (application_name) (sachant que cette table doit contenir la liste des applications avec quelques informations supplémentaires sur chaque application). J'ai donc voulu affecter à cette colonne une clé unique : ALTER TABLE `tickets`.`application` ADD UNIQUE `ind_appli_name` (`application_name`); mais
    #1062 - Duplicata du champ 'APPLICATIONNAME' pour la clef 'ind_appli_name'
    Donc, que faire ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 371
    Par défaut
    La réponse est dans le message d'erreur: tu as des valeurs dupliquées pour cette colonne, donc tu ne peux pas créer un index unique.
    Il faut en premier "dédoublonner" les lignes de la table. Ensuite tu pourras créer un index unique sur cette colonne.

    Tatayo.

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 486
    Billets dans le blog
    1
    Par défaut
    Je me suis souvenu que APPLICATIONNAME est le nom que j'ai donné à la colonne APPLICATION_NAME dans les 2 enregistrements. J'ai donc vidé la table (en désactivant le contrôle des clés étrangères car sinon il voulait pas), et le tour est joué

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 542
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Ici tu as bien une clé primaire, mais pas d'index unique.
    Je ne pense pas que ce soit possible : ce n'est pas le cas de tous les SGBD, mais MySQL génère automatiquement l'index correspondant à la déclaration de la PK

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 371
    Par défaut
    Je n'ai en effet pas été assez précis dans ma réponse (pour changer ).
    Il y a bien une clé primaire sur la table, clé qui ne comporte qu'une seule colonne: application_key.
    Or LaurentSc désire que l'unicité dans l'ordre INSERT INTO soit fait sur la colonne application_name, pour laquelle il n'y a aucun index unique.

    Tatayo.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PDO] PDO MySQL INSERT INTO rien ne s'insere.
    Par jano_dave dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/12/2009, 10h49
  2. A propos de INSERT IGNORE INTO
    Par MoKeS dans le forum Requêtes
    Réponses: 3
    Dernier message: 26/05/2009, 14h09
  3. [INSERT INTO] Rien dans ma base !
    Par dekovince dans le forum Débuter
    Réponses: 7
    Dernier message: 21/03/2007, 17h37
  4. Bulk insert ignorant des lignes
    Par elvivo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/09/2006, 03h45
  5. [MySQL] insert or rien
    Par manshoon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/06/2006, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo