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

 PostgreSQL Discussion :

Conflit de clées étrangères


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Points : 40
    Points
    40
    Par défaut Conflit de clées étrangères
    Bonjour,

    Je dispose de 2 tables que voici
    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
     
    CREATE TABLE POSITION(
    NumeroChr VARCHAR(25),
    IdEnsembl VARCHAR(25),
    ...
    ...
    Foreign key (NumeroChr) references CHROMOSOME(NumeroChr),
    Foreign key (IdEnsembl) references GENE(IdEnsembl));
     
     
     
    CREATE TABLE CHROMOSOME(
    NumeroChr VARCHAR(25),
    Taille INT CHECK(Taille >= 0),
    Primary key (NumeroChr));
    Voici mon problème, je commence par insérer mes données dans la table chromosome, cela ne pause aucun problème. Mais lorsque je tente de remplir ma table POSITION, j'obtiens le message d'erreur suivant :

    psycopg2.IintegrityError:insert or update on table "position" violate foreign key constraint "position_numeroChr_fkey"
    DETAIL: Key (numerochr) = ("X"') is not present in table "CHROMOSOME".
    Pourtant les chromosome (1,2,3... ect) sont bien implémentés dans la table position, le chromosome X est lui bel et bien présent dans la table CHROMOSOME, mais ne s'implémente pas la table POSITION, je ne comprends pas pourquoi, si vous avez une idée je suis preneur

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    DETAIL: Key (numerochr) = ("X"') is not present in table "CHROMOSOME".
    Bonjour,

    Pour moi vous avez un problème de quote ou double quote (qui encadre le X)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Points : 40
    Points
    40
    Par défaut
    Désolé j'ai recopié le message d'erreur à la main, le X est entouré uniquement de double quote:



  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    quel est votre requête d'insert ?
    Ceci devrait marcher sans problème, je reste sur ma 1ere pensée => problème avec des quote en trop

  5. #5
    Membre averti Avatar de hariman
    Homme Profil pro
    Développeur Java, Android
    Inscrit en
    Janvier 2008
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations professionnelles :
    Activité : Développeur Java, Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2008
    Messages : 200
    Points : 413
    Points
    413
    Par défaut
    Bonjour,

    Cette erreur survient quand on crée un enregistrement avec une valeur inexistante pour une clé etrangère.

    Vérifie si la table POSITION contient bien un enregistrement avec NumeroChr = "X".
    Les boutons et adorent être cliqués, donc ne les oubliez pas

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Points : 40
    Points
    40
    Par défaut
    Je ne suis pas au travail actuellement, je vous montrerai la requête en fin d'après midi.

    Vérifie si la table POSITION contient bien un enregistrement avec NumeroChr = "X".
    Justement c'est quand je veux insérer la valeur X avec un script dans ma table POSITION que je reçois ce message d'erreur, alors que les autres valeurs de humerochr s'implémentent correctement, et le type de numerochr est VARCHAR, cela devrait marcher :/

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 53
    Points : 40
    Points
    40
    Par défaut
    Voici mon script python permettant l'insertion (avec la requête d'insertion):







    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #!/usr/bin/python
     
    # Import des modules python pour postgresql
    import psycopg2
    import psycopg2.extras
     
     
     
    # Programme de lecture du fichier biomart.txt 
    # de decoupage des informations pour les mettres dans la table Position
    # de notre base de donnees.
     
     
    # Programme Principal
    if __name__ == '__main__':
     
        # Entrer le nom du schema de la base!
        schema = raw_input("Entrez le nom du schema de la base [public] : ")
        # Par defaut le nom du schema sera cours
        if schema == "":                # l'utilisateur n'a rien rentre
            schema="public"     # alors schema=public par defaut
     
     
     
        geneFileName = raw_input("Entrez le nom du fichier contenant \
    la liste des genes [biomart.txt] : ")
     
        # Par defaut le nom du fichier a lire sera gene.txt
        if geneFileName == "":          # l'utilisateur n'a rien rentre
            geneFileName="biomart.txt"     # alors genefilename=valeur par defaut
     
        print geneFileName
     
        # On ouvre le fichier que l'on veut lire!
        geneFile = open(geneFileName,"r")    # r indique lecture
     
        # Lecture d'un ligne dans le fichier des genes
        # Lecture de la premiere ligne avec les noms de colonnes
        ligne = geneFile.readline()
     
        # connection a la base de donnees pour permettre l'insertion des genes
        try:
            # Connecteur a la base de donnees
            connecteur = psycopg2.connect("dbname='ma_base' host='localhost' user='postgres' password='slivoide'")
            cur = connecteur.cursor(cursor_factory=psycopg2.extras.DictCursor)
     
        except Exception, e:
                print "<h1>Erreur lors de l'execute</h1>"
                print e.pgcode
                print e.pgerror
     
     
     
        # Lecture des lignes suivantes avec les informations sur les positions.
        for ligne in geneFile.readlines():
            ligne = ligne.rstrip('\n') # on retire le dernier caractere (retour chariot)
     
            cols = ligne.split('	')    # Decoupage de la ligne pour recuperer les differents elements
            idensembl  = cols[0]       # Colonne 0 le nom du gene
            numerochr = cols[1]        # Colonne 1 le numero de chromosome
            debut = cols[2]     
            fin = cols[3]
    	sens = cols[7]
     
            #
            requetePosition = "insert into "+schema+".position (numerochr,idensembl,debut,fin,sens) values ('"+str(numerochr)+"','"+str(idensembl)+"','"+str(debut)+"','"+str(fin)+"','"+str(sens)+"')";
     
     
     
            # Maintenant on peut inserer les positions
            cur.execute(requetePosition)
           	connecteur.commit()
     
     
     
     
        geneFile.close();

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    votre probleme releve du python (ou des données de votre fichier .txt) et non de pgsql. si vous faites cette insert à la main, via pgadmin par exemple, il marchera sans problème.

Discussions similaires

  1. [2.x] Injecter une valeur dans une clée étrangère
    Par Philcmoi dans le forum Symfony
    Réponses: 5
    Dernier message: 02/09/2014, 09h18
  2. [Modèle Relationnel] Historique et ré-affectation de clée étrangère
    Par cladoo dans le forum Schéma
    Réponses: 11
    Dernier message: 19/07/2012, 10h28
  3. [Easyphp 5.3.0 | Mysql 5.1.37] Gestion des cles étrangères
    Par narutobaka dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 27/08/2009, 16h39
  4. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49
  5. cle pour programme
    Par mumu2001 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 04/11/2002, 10h34

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