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

Langage SQL Discussion :

clé etrangere sur donnée


Sujet :

Langage SQL

  1. #1
    Membre du Club

    Inscrit en
    Avril 2005
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 246
    Points : 57
    Points
    57
    Par défaut clé etrangere sur donnée
    Bonjour

    Jai deux tables : article et categorie . la table article a un champs id_cat qui pointe sur le champs id_cat de la table categorie.
    J'ai voulue modifier id_cat j'ai supprimé cette clé etrangere et j'ai mis pour un article le id_cat a 'TOTO' et dans la table categorie j'ai mis aussi le id_cat à 'TOTO' .Jusque la tout va bien mais lorsque je veux remettre ma clé etrangere voila l'erreure que j'obtiens:
    ALTER TABLE article
    ADD CONSTRAINT fk_id_cat FOREIGN KEY (id_cat )
    REFERENCES categorie (id_cat ) MATCH SIMPLE
    ON UPDATE RESTRICT ON DELETE RESTRICT;

    ERROR: insert or update on table "article" violates foreign key constraint "fk_id_cat "
    DETAIL: Key (id_cat )=(TOTO) is not present in table "categorie".
    Je ne comprends rien!!
    une idée?

    MErci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Reprenons depuis le début...

    1) La règle de gestion
    Un article appartient à une et une seule catégorie

    2) Schéma MCD Merise
    Article -1,1----Appartenir----0,n- Catégorie

    3) Les tables qui en découlent (exemple)
    Categories(id_cat, Nom_cat, ...)
    Articles(id_art, id_cat, nom_art, ...)

    Nota :
    - La bonne pratique consiste à donner aux clés primaires (ici id_cat et id_art) le type entier non signé auto-incrémenté.
    - La clé étrangère id_cat de la table Articles est évidemment du même type que id_cat de la table Categories (auto-incrémentation en moins).
    - Si le moteur de votre SGBD accepte les contraintes d'intégrité référentielle, vous pouvez ajouter une clause ON DELETE CASCADE sur la clé étrangère. ON UPDATE CASCADE ne sert à rien sur une clé étrangère issue d'une clé primaire entière auto-incrémentée car on ne change pas les valeurs d'une clé primaire.

    4) Vous voulez changer la catégorie d'un article ?
    Exemple :
    "Affecter à l'article 'Stylo plume' la catégorie 'Papèterie'."
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE Articles
    SET id_cat = (
      SELECT id_cat
      FROM Categories
      WHERE nom_cat = 'Papèterie')
    WHERE nom_art = 'Stylo plume'

  3. #3
    Membre du Club

    Inscrit en
    Avril 2005
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 246
    Points : 57
    Points
    57
    Par défaut
    les point 1-2-3 sont correctes

    Cependant le point 4 ce n'est pas ca, je veux par exemple
    modifier la categorie papeterie qui a pour id_cat "papeterie"
    en "papier" donc je modifie id_cat dans la table categorie et dans la table article en "papier".
    J'ai donc besion de supprimer la contrainte referentiel puis de la reinstaller...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    J'ai donc besion de supprimer la contrainte referentiel puis de la reinstaller...
    Pas nécessairement si vous avez une règles de gestion de l'IR qui est CASCADE.

    Lisez les articles que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/s...partie2#L7.3.2
    A +

  5. #5
    Membre du Club

    Inscrit en
    Avril 2005
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 246
    Points : 57
    Points
    57
    Par défaut
    cependant , j'ai dèjà effectué de cette manière donc je suis obligé de remettre la clé etrangere...

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par c+cool Voir le message
    les point 1-2-3 sont correctes

    Cependant le point 4 ce n'est pas ca, je veux par exemple
    modifier la categorie papeterie qui a pour id_cat "papeterie"
    en "papier" donc je modifie id_cat dans la table categorie et dans la table article en "papier".
    J'ai donc besion de supprimer la contrainte referentiel puis de la reinstaller...
    C'est justement l'intérêt d'une clé primaire entière et non pas de format texte !
    Si vous ne changez que le libellé de la catégorie, par exemple parce qu'il a été mal écrit, vous ne changez pas son numéro. Donc vous n'avez à modifier que dans la table Categories.

    Si vous changez la catégorie 'Papèterie' en 'Papier', peut-être que le stylo plume n'y figurera plus et il y aura alors nécessité d'affecter une nouvelle catégorie à l'article 'stylo plume' dans la table 'Articles'. Et aucun SGBD ne peut deviner comment partitionner l'ancienne catégorie 'Papèterie' en 'Papier' et 'Ecriture' par exemple.

    Si votre modèle de données est correctement structuré, vous ne devriez pas avoir à supprimer et remettre une clé étrangère.

    Si vous avez pris comme clé primaire (et donc comme clé étrangère) un libellé modifiable, alors il vous faut la clause ON UPDATE CASCADE sur les clés étrangères.
    Si votre moteur de base de données ne l'accepte pas ou ne l'a pas implémenté, procédez comme suit :
    - Ajout de la nouvelle catégorie
    - Mise à jour des tables qui utilisent la catégorie comme clé étrangère avec la nouvelle catégorie
    - Suppression de l'ancienne catégorie.

  7. #7
    Membre du Club

    Inscrit en
    Avril 2005
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 246
    Points : 57
    Points
    57
    Par défaut
    je suis à nouveau à 100% d'accord avec vous ,je ne demande pas comment créer une table et ses références, celle ci a déjà été créé et je dois travailler avec cette structure je n'ai pas le choix!

    Je pense que ma base est corrompue je me lance vers une sauvegarde pour refaire mes modifications.

    Merci

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/04/2007, 08h10
  2. filtre sur donnée numérique
    Par Daranc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/04/2007, 17h25
  3. Message sur données POST involontaire
    Par lodan dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2006, 22h34
  4. Auto-increment et cles etrangeres sur diferents sgdb.
    Par jota5450 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 26/09/2006, 11h57
  5. Réponses: 5
    Dernier message: 12/06/2006, 14h56

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