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 :

Requete INSERT if not exists


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 56
    Par défaut Requete INSERT if not exists
    Bonjour,

    Je voudrais inserer des lignes dans une table a condition qu'ils n'existe pas dans la table.

    voici la structure de la table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    CREATE TABLE `t_vaccination` (
        `nIdVaccination` INT(10) UNSIGNED NOT NULL,
        `nIdVaccin` INT(10) UNSIGNED NULL DEFAULT NULL,
        `nIdVacProtocole` INT(10) UNSIGNED NULL DEFAULT NULL,
        `nIdPatient` INT(10) UNSIGNED NOT NULL,
        `nIdUtilisateur` INT(10) UNSIGNED NULL DEFAULT NULL,
        `sDateInjection` VARCHAR(8) NOT NULL DEFAULT '',
        `nNumInjection` VARCHAR(45) NOT NULL DEFAULT '0',
        `sNumLot` VARCHAR(45) NOT NULL DEFAULT '',
        `nRappel` TINYINT(4) NOT NULL DEFAULT '0',
        `sLibelle` VARCHAR(255) NOT NULL DEFAULT '',
        `sAction` VARCHAR(16) NOT NULL DEFAULT 'A 20080101000000',
        `sDH_REPLIC` DATETIME NULL DEFAULT '2010-01-01 00:00:00',
        PRIMARY KEY (`nIdVaccination`),
        INDEX `NDX_t_vaccination_nIdUtilisateur` (`nIdUtilisateur`),
        INDEX `NDX_t_vaccination_nIdVaccin` (`nIdVaccin`),
        INDEX `NDX_t_vaccination_nIdVacProtocole` (`nIdVacProtocole`),
        INDEX `NDX_t_vaccination_nIdPatient` (`nIdPatient`),
        CONSTRAINT `FK_vaccination_nIdUtilisateur_utilisateur` FOREIGN KEY (`nIdUtilisateur`) REFERENCES `t_utilisateur` (`nIdUtilisateur`),
        CONSTRAINT `FK_vaccination_nIdVaccin_vaccin` FOREIGN KEY (`nIdVaccin`) REFERENCES `t_vaccin` (`nIdVaccin`)
    )
    voici la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO t_vaccination (nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur) 
    SELECT 41,4,53,1 
    FROM t_vaccination 
     WHERE NOT EXISTS (SELECT nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur 
                                 FROM t_vaccination 
                                 WHERE nIdVaccin = NULL 
                                      and nIdVacProtocole = NULL 
                                      and nIdPatient = 53 
                                      and nIdUtilisateur =1 ) 
    LIMIT 1
    Le champ nIdVaccination ne s’incrémente pas automatiquement et :
    1 - à la première exécution il insère la ligne dans la table et met la valeur 0 pour le champ nIdVaccination
    2 – à la deuxième exécution il n’insère pas la ligne puisqu’il y a déjà une ligne ou nIdVaccination a la valeur 0

    Conclusion : la condition where not exists n’ai pas pris en compte dans la requete.

    comment faire pour que l'insert ne se fait que si les les valeurs des champs nIdVaccin, nIdVacProtocole, nIdPatient et nIdUtilisateur n'existe pas dans la table.

    Cordialement

    Motti

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 85
    Par défaut
    Bonjour,

    Tu peut créer un index unique composé (nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur) qui va donc râlé si tu insère un doublon

    Après si tu n'as pas besoin d'index, mhhh

    Je n'ai pas bien compris ta requête, (je ne suis pas forcément expert) :

    C'est quoi ceci

    SELECT 41,4,53,1 wa je n'ai jamais vu ceci auparavant en fait. cela fait quoi ? Je ne connaissais pas.

    Cela correspond aux champs nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur ? Ne pas ce tromper dans l'ordre alors.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT nIdVaccin, nIdVacProtocole, nIdPatient, nIdUtilisateur 
                                 FROM t_vaccination 
                                 WHERE nIdVaccin = NULL 
                                      AND nIdVacProtocole = NULL 
                                      AND nIdPatient = 53 
                                      AND nIdUtilisateur =1
    Sélectionne donc l'utilisateur "1" qui as eus le patient "53" et qui n'as eus de protocole et vaccin. C'est possible ça ? Un patient à qui on affecte aucun vaccin ?

    D'autant plus que si tu insère "41,4,53,1", que tu mettes "nIdVaccination" a auto-incrémente, tu pourra de nouveau insérer "41,4,53,1", car tu sélectionne un patient associé à un utilisateur qui n'as pas eut de protocole et vaccin (ce qui ne semble jamais être le cas, ton exists renverra donc une liste vide). tu aura donc un doublon dont tu semble dire ne pas vouloir.
    (c'est ce que je comprends)

    Sinon le truc simple, c'est que tu spécifie

    `nIdVaccination` INT(10) UNSIGNED NOT NULL,
    ce champ aura donc comme valeur par défaut "0"

    première insertion : 0
    Deuxième : 0 aussi, vu que tu ne précise de valeur dans ton insert et par défaut ton champs ne peut être nul et prendra donc la valeur 0 qui est en conflit avec l'idée que ce champ est une clé primaire donc unique et tu ne peut avoir donc d'autre insertion.

    Un INT prend par défaut la valeur 0.

    Sois tu mets en auto incrément, sois tu donne une valeur dans ton Insert en s'assurant quelle ne sois déjà prise.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    C'est normal que votre requete ne fonctionne pas comme vous voulez :
    Aucune de ces conditions ne sera jamais vrai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
           nIdVaccin = NULL 
    AND nIdVacProtocole = NULL 
    ...
    En effet, NULL n'est égal à rien, même pas à NULL.

    Pour tester la nullité d'une colonne, utilisez IS NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
           nIdVaccin IS NULL 
    AND nIdVacProtocole IS NULL 
    ...

Discussions similaires

  1. INSERT IF NOT EXISTS
    Par finiderire dans le forum Langage SQL
    Réponses: 12
    Dernier message: 27/03/2012, 17h44
  2. REQUETE INSERT WHERE NOT EXISTS
    Par tidou95220 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/03/2012, 13h35
  3. requete SQL intersect/not exist
    Par Baldric de Dol dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/10/2008, 17h18
  4. Insert .. where not exists
    Par Zolex dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 02/03/2007, 11h26
  5. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26

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