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

Looping Discussion :

si identifiant relatif alors erreur


Sujet :

Looping

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

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

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 737
    Points : 4 214
    Points
    4 214
    Billets dans le blog
    1
    Par défaut si identifiant relatif alors erreur
    Bonsoir,

    lorsqu'on déclare un identifiant relatif, la conséquence sur le script SQL de la création de la table associée est que :

    1- la clé primaire est composée de 2 colonnes : les identifiants des 2 tables ;

    2- la table concernée comporte un attribut déclaré comme clé étrangère vers l'autre table.

    Souci : cet attribut-FK est placé avant l'attribut-identifiant, d'où message d'erreur :
    Error Code: 1075. Incorrect table definition; there can be only one auto column and it must be defined as a key
    Bug vu sous MySQLWorkbench.

    Si on déplace l'attribut-identifiant au début du script de déclaration de la table, le message d'erreur disparaît.

    Pour éviter ce bug, il serait souhaitable de placer la clé primaire de la classe d'entité en premier dans le script SQL de création de la table SQL correspondante.

    EDIT1 : pour reproduire le bug, il faut déclarer la clé primaire en AUTO_INCREMENT

    EDIT2 : pour reproduire :
    Nom : MCD31x700.png
Affichages : 22
Taille : 6,3 Ko

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE classB(
       B_ident INT UNSIGNED AUTO_INCREMENT,
       PRIMARY KEY(B_ident)
    );
     
    CREATE TABLE classA(
       B_ident INT UNSIGNED,
       a_ident INT UNSIGNED AUTO_INCREMENT,
       PRIMARY KEY(B_ident, a_ident),
       FOREIGN KEY(B_ident) REFERENCES classB(B_ident)
    );
    Pour supprimer le message d'erreur, il faut :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE classB(
       B_ident INT UNSIGNED AUTO_INCREMENT,
       PRIMARY KEY(B_ident)
    );
     
    CREATE TABLE classA(
       a_ident INT UNSIGNED AUTO_INCREMENT,
       B_ident INT UNSIGNED,  
       PRIMARY KEY(B_ident, a_ident),
       FOREIGN KEY(B_ident) REFERENCES classB(B_ident)
    );
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  2. #2
    Membre chevronné
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    juin 2019
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2019
    Messages : 446
    Points : 1 804
    Points
    1 804
    Par défaut
    Bonsoir,

    Vous avez déjà posé la même question il y 3 semaines et voici la réponse faite par escartefigue et confirmée par fsmrel :

    bonjour Laurent
    Il faut rapprocher cette remarque du MCD auquel elle se rapporte et dont je reproduis l'extrait ci-dessous

    Dans ce MCD, LO_location est identifié relativement (R) à COU_country, la localisation étant une entité-type faible du pays.
    Dans la table issue de l'entité-type faible, la clef primaire doit être, dans cet ordre, l'identifiant de l'entité-type forte complété de l'identifiant de l'entité-type faible
    Il est donc normal d'avoir dans la table LO_location, une PK composée dans cet ordre de COU_ident puis LO_ident.
    Ce faisant, avec la PK déclarée comme CLUSTER (pour MYSQL, cluster index et index primaire ne font qu'un), les lignes de la table LO_location d'un même pays seront rangées de façon contiguë, ce qui est bénéfique aux performances d'accès.
    Si on construisait la PK dans l'autre sens (id location puis id country) alors on dégraderait fortement les performances d'accès.

    Il faut noter que l'erreur produite par MySQL n'en est pas une pour les autres SGBD, c'est l'une des bizarreries de ce SGBD.
    De plus, comme je l'ai déjà signalé également, si LO_ident est auto-incrémenté, il représente à lui seul une clé primaire : le rajout de l'identifiant relatif provoque donc forcément une surclé, ce qui est très discutable du fait du non-respect de la propriété d'irréductibilité (clé minimale).
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

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

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

    Informations forums :
    Inscription : octobre 2006
    Messages : 8 737
    Points : 4 214
    Points
    4 214
    Billets dans le blog
    1
    Par défaut
    En effet ; je me rappelais pas d'en avoir déjà parlé...
    Merci pour votre remarque sur l'irréductibilité. C'est vrai qu'ici, il faut enlever AUTO_INCREMENT.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

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

Discussions similaires

  1. [MCD] Définition 'lien identifiant' & 'identifiant relatif'
    Par knoxville dans le forum Schéma
    Réponses: 14
    Dernier message: 19/03/2011, 01h27
  2. Identifiant relatif PowerDesigner
    Par moumoune65 dans le forum PowerAMC
    Réponses: 1
    Dernier message: 29/08/2007, 19h57
  3. identifiant relatif en sql
    Par jiojioforever dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/02/2007, 15h11
  4. [Identifiant relatif] access
    Par Fredo02 dans le forum Access
    Réponses: 1
    Dernier message: 19/01/2006, 21h14
  5. Générer un identifiant relatif > l'entité faible en prati
    Par vmolines dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 19/08/2005, 15h59

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