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

Bases de données Discussion :

Vérifier la présence d'un enregistrement avant insertion


Sujet :

Bases de données

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut Vérifier la présence d'un enregistrement avant insertion
    Bonjour,
    Je cherche à faire une fonction simple permettant de savoir si une donnée est déjà présente dans ma base avant de l'insérer afin d'éviter les doublons. Est-ce qu'il existe un mot-clé en SQL permettant de réaliser ce genre de chose simplement? ou est-ce que je suis obligé de parcourir tous les résultats à chaque fois?
    C'est pour une bibliothèque de films dont chaque film est rentré dans la base à partir de son chemin. Je calcule également un hash md5 du fichier. C'est par comparaison de ce hash que j'aimerai savoir si le fichier est présent. Sachant qu'on imagine une base de 1000 films, parcourir 1000 lignes à chaque fois que j'ajoute un fichier me paraît energivore.

    Exemple: Nouveau film à rentrer / Calcul du hash / vérifiation si il y a déjà un film avec le même hash / si non, l'insérer / si oui, ne rien faire.

    Merci de votre aide.

    Cordialement

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 593
    Points
    188 593
    Par défaut


    Pour sélectionner toutes les données, je suppose que tu utilises une commande SQL du type SELECT * ? Tu peux y ajouter des contraintes pour sélectionner uniquement les entrées avec la bonne empreinte MD5 (SELECT * WHERE md5=…) : soit tu n'as aucune entrée (film inconnu), soit tu en as une (déjà inséré).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    Effectivement. Mais une fois que j'ai fait ma requête, comment est-ce que je peux faire pour savoir si elle contient quelque chose ou rien?
    Au passage, j'ai trouvé ça qui semble être exactement ce que je veux faire:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF NOT EXISTS (SELECT database_name FROM uses_databases WHERE database_name = 'DB1' AND database_owner = 'x@x.com')
        INSERT INTO users_databases (database_name, database_key, database_secret, database_owner) 
        VALUES ('DB1', '263f690d-7ac3-49f2-aa3b-f5672e4639a2', '367123d8-e5a7-46a0-8101-21f39e6ac8d9', 'x@x.com');

    ça me permet de mettre le test directement dans la requête d'insertion. Je vais tester.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    J'ai essayé mais je tombe toujours sur une erreur du type "Nombre de paramètres incorrect". J'ai cherché partout mais je n'arrive pas à résoudre ce problème.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    bool bdd::addMovie(const Movie &movie)
    {
        mmldb.setDatabaseName(pathDB);
     
        if(mmldb.open())
        {
            qDebug()<<"étape 1";
            QSqlQuery query;
     
            query.prepare("INSERT INTO Movies(title, md5, jacketPath, jacketMd5, releaseDate, genre, note, alreadySeen,\
                                             favourite, toBeSeen, synopsis, duration, pathWallPaper, path, nationality)\
                          VALUES (:title, :md5b, :jacketPath, :jacketMd5, :releaseDate, :genre, :note, :alreadySeen, \
                                  :favourite, :toBeSeen, :synopsis, :duration, :pathWallPaper, :path, :nationality)\
                          WHERE NOT EXISTS (SELECT md5 FROM Movies WHERE md5 =:md5a )");
     
            query.bindValue(":title", movie.title);
            query.bindValue(":md5a",movie.md5);
            query.bindValue(":md5b",movie.md5);
            query.bindValue(":jacketPath","");  //voir comment faire
            query.bindValue(":jacketMd5","");  //voir comment faire
            query.bindValue(":releaseDate",movie.releaseDate);
            query.bindValue(":genre",movie.genre);
            query.bindValue(":note",movie.note);
            query.bindValue(":alreadySeen",movie.alreadySeen);
            query.bindValue(":favourite",movie.favourite);
            query.bindValue(":toBeSeen",movie.toBeSeen);
            query.bindValue(":synopsis",movie.synopsis);
            query.bindValue(":duration",movie.duration);
            query.bindValue(":pathWallPaper", movie.pathWallPaper);
            query.bindValue(":path", movie.path);
            query.bindValue(":nationality", movie.nationality);
     
            if (query.exec())
            {
                qDebug()<<"étape 2";
                mmldb.close();
     
            }
            else
            {
                qDebug()<<query.lastError().text();
                emit RequetteNonPossible(query.lastError().text());
                mmldb.close();
                return false;
            }
            mmldb.close();
        }
        else
        {
            emit BDDAbsente(mmldb.lastError().text());
            return false;
        }
        return true;
    }
    Merci de votre aide.

  5. #5
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 593
    Points
    188 593
    Par défaut
    Je pensais plutôt effectuer deux requêtes distinctes : un premier SELECT, puis un INSERT si la réponse à la première requête te convient. Certes, d'un point de vue base de données, ce n'est pas le meilleur que l'on puisse faire (deux requêtes au lieu d'une seule), mais tu as directement l'information d'existence.

    D'ailleurs, la requête que tu as écrite (message h 8 h 47) ne semble pas valide, à cause de l'utilisation simultanée d'un VALUES et d'un WHERE (http://stackoverflow.com/questions/4...#answer-485057). L'autre me semble moins douteuse.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    J'ai essayé comme vous me l'avez conseillé, j'ai encore une erreur "Nombre de paramètres incorrect" sur la première requête. Je comprends pas pourquoi, ça devrait marcher.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    bool bdd::addMovie(const Movie &movie)
    {
        mmldb.setDatabaseName(pathDB);
     
        if(mmldb.open())
        {
            QSqlQuery checkQuery;
            checkQuery.prepare("SELECT COUNT(*) FROM Movies WHERE md5=:coucou)");
            checkQuery.bindValue(":coucou",movie.md5);
            if(!checkQuery.exec() || !checkQuery.first())
            {
                qDebug() << "étape 0.1";
                qDebug() << checkQuery.lastError().text();
                qDebug() << "étape 1";
            }
            else if(checkQuery.value(0)==0)
            {
                QSqlQuery query;
                query.prepare("INSERT INTO Movies(title, md5, jacketPath, jacketMd5, releaseDate, genre, note, alreadySeen,\
                              favourite, toBeSeen, synopsis, duration, pathWallPaper, path, nationality)\
                        VALUES (:title, :md5, :jacketPath, :jacketMd5, :releaseDate, :genre, :note, :alreadySeen, \
                                :favourite, :toBeSeen, :synopsis, :duration, :pathWallPaper, :path, :nationality)");
     
                query.bindValue(":title", movie.title);
                query.bindValue(":md5",movie.md5);
                query.bindValue(":jacketPath","");  //voir comment faire
                query.bindValue(":jacketMd5","");  //voir comment faire
                query.bindValue(":releaseDate",movie.releaseDate);
                query.bindValue(":genre",movie.genre);
                query.bindValue(":note",movie.note);
                query.bindValue(":alreadySeen",movie.alreadySeen);
                query.bindValue(":favourite",movie.favourite);
                query.bindValue(":toBeSeen",movie.toBeSeen);
                query.bindValue(":synopsis",movie.synopsis);
                query.bindValue(":duration",movie.duration);
                query.bindValue(":pathWallPaper", movie.pathWallPaper);
                query.bindValue(":path", movie.path);
                query.bindValue(":nationality", movie.nationality);
     
                if (query.exec())
                {
                    qDebug()<<"étape 2";
                    mmldb.close();
                }
                else
                {
                    qDebug()<<query.lastError().text();
                    emit RequetteNonPossible(query.lastError().text());
                    mmldb.close();
                    return false;
                }
            }
            else
            {
                emit RequetteNonPossible(checkQuery.lastError().text());
                mmldb.close();
                return false;
            }
        }
        else
        {
            emit BDDAbsente(mmldb.lastError().text());
            return false;
        }
        return true;
    }

  7. #7
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 593
    Points
    188 593
    Par défaut
    A priori, je ne vois rien de choquant. Essaie peut-être la requête directement sur ta base de données (avec un outil comme SQLiteManager), juste pour vérifier qu'elle est bien correcte (je pense plutôt à une légère différence par rapport au schéma).

    (e) Il n'y aurait pas une parenthèse de trop, en seconde lecture ? checkQuery.prepare("SELECT COUNT(*) FROM Movies WHERE md5=:coucou)");
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    C'est bon ça marche, c'est effectivement cette histoire de parenthèse qui faisait afficher ce message d'erreur. Par contre il m'affiche tout le temps 1 élément. Je vais tâcher de voir ce qui ne va pas.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 218
    Points : 55
    Points
    55
    Par défaut
    ça marche, deuxième erreur de ma part concernant l'appel de la fonction.
    Merci de votre aide, je place le sujet en résolu.

    Cordialement

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

Discussions similaires

  1. Vérifier l'existence d'un enregistrement avant insertion
    Par patnership dans le forum Général Java
    Réponses: 5
    Dernier message: 19/02/2015, 13h05
  2. [AC-2007] Requête pour vérifier la présence d'un enregistrement dans une table.
    Par Mat08 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/09/2011, 18h06
  3. [MySQL] vérifier l'existance d'un enregistrement avant insertion
    Par patheoson dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 22/01/2010, 12h47
  4. vérifier si une table est vide avant insertion
    Par cashmoney dans le forum JDBC
    Réponses: 7
    Dernier message: 21/04/2009, 17h54
  5. [MySQL] Vérification de la présence d'enregistrement avant insertion
    Par Odilon dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/09/2005, 15h30

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