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 :

J'ai un problème avec ma chaine SQL (ajout d'une clé étrangère)


Sujet :

Requêtes MySQL

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut J'ai un problème avec ma chaine SQL (ajout d'une clé étrangère)
    Bonjour tout le monde,

    J'ai un problème avec ma chaîne SQL que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE `inscriptions` CHANGE `Matricule` `Matricule` TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT 'Clé étrangère de Matricule dans Etudiants'
    ADD FOREIGN KEY (Matricule) references etudiants(Matricule);
    Voici le message d'erreur :

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ALTER TABLE `inscriptions` ADD FOREIGN KEY (Matricule) references etudiants(Matr' at line 2
    Merci d'avance pour votre aide.

    beegees

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 770
    Points
    23 770
    Par défaut
    Il manque une virgule à la fin du CHANGE, juste avant le ADD FOREIGN KEY, pour séparer les 2 instructions.

    ced

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par ced Voir le message
    Il manque une virgule à la fin du CHANGE, juste avant le ADD FOREIGN KEY, pour séparer les 2 instructions.

    ced
    Bonjour,

    Merci pour ta réponse.

    Voici le message d'erreur que j'obtiens en ayant mis la virgule (je pense en fait que je ne l'a mets pas au bon endroit) :

    Erreur

    requête SQL:

    ALTER TABLE `inscriptions` CHANGE `Matricule` `Matricule` TINYTEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT 'Clé étrangère de Matricule dans Etudiants',
    ADD FOREIGN KEY ( Matricule ) REFERENCES etudiants( Matricule )

    MySQL a réponduocumentation
    #1170 - BLOB/TEXT column 'Matricule' used in key specification without a key length
    [ Retour ]
    Qu'en penses-tu ?

    Merci.

    beegees

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Devons-nous comprendre que 'Matricule' devient une colonne TINYTEXT ?
    Et tu veux en faire une clé étrangère ?
    Ne me dis pas que tu as mis une colonne de ce type là en clé primaire dans la table 'etudiants' ?

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 770
    Points
    23 770
    Par défaut
    Voici ce que dit la documentation MySQL à ce sujet :
    Pour les colonnes CHAR et VARCHAR, les index peuvent être créés sur uniquement une partie de la colonne, avec la syntaxe col_name(length). Pour les colonnes BLOB et TEXT la longueur d'index est obligatoire.
    Mais effectivement, mettre un BLOB ou un TEXT en identifiant d'une table, c'est prendre un bazooka pour dégommer un moustique .

    ced

  6. #6
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Devons-nous comprendre que 'Matricule' devient une colonne TINYTEXT ?
    Et tu veux en faire une clé étrangère ?
    Ne me dis pas que tu as mis une colonne de ce type là en clé primaire dans la table 'etudiants' ?
    Bonjour,

    Merci pour ta réponse.

    Je débute en mySQL, je n'y travaille que depuis lundi.

    J'ai acheté un livre (PHP 5 le guide complet) et dans ce livre (que je trouve pas mal mais pas très complet) je peux lire :

    TINYTEXT : Texte contenant maximum 255 caractères.

    Vue que le matricule ne dépassera jamais 6 caractères, je m'étais dit que pour gagner de la mémoire, s'était idéal.

    Maintenant, si tu me dis qu'on peut pas, saurais-tu me dire exactement pourquoi ?

    Saurais-tu me dire comment je peux accèder au code SQL de la structure de ma table, cela me permettrait alors de pouvoir te montrer sa structure.

    Merci d'avance pour ta réponse.

    beegees

    Citation Envoyé par ced Voir le message
    Voici ce que dit la documentation MySQL à ce sujet :

    Mais effectivement, mettre un BLOB ou un TEXT en identifiant d'une table, c'est prendre un bazooka pour dégommer un moustique .

    ced
    Bonjour Ced,

    Je ne savais pas.

    Que me conseilles-tu de mettre alors ?

    S'est un entier sur 6 chiffres mais je veux éviter l'entier car il commencera souvent par 00 ou 000, je sais que les entiers ne prennent pas compte du 0 alors, chose que je dois éviter ici.

    Merci d'avance pour ta réponse.

    beegees

  7. #7
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    Bah, un CHAR(6) alors.... (pourquoi faire simple,.... hein ?)

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    14
    Par défaut
    Beegees, cherche les tutoriaux sur ce site, plusieurs t'expliqueront qu'il vaut mieux utiliser comme clé primaire une colonne de type INT auto incrémentée.
    Ta colonne 'Matricule' peut être de type CHAR(6) comme suggéré par ailleurs si tu es sûr que le matricule ne dépassera jamais 6 caractères. Elle peut de plus (c'est conseillé puisque c'est sur elle que s'effectuera la recherche) être un INDEX à contrainte UNIQUE.

    La raison invoquée pour le choix du type de la clé primaire est la performance. Mais si dans ton cas, tu n'as pas des dizaines de milliers de matricules à gérer, le gain de performance avec une clé primaire de type INT sera peut-être négligeable. Auquel cas tu peux effectivement prendre le matricule comme clé primaire, mais pas avec le type TINYTEXT.

  9. #9
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Bah, un CHAR(6) alors.... (pourquoi faire simple,.... hein ?)
    Ok j'ai suivi ton conseil, merci !

    beegees

    Citation Envoyé par CinePhil Voir le message
    Beegees, cherche les tutoriaux sur ce site, plusieurs t'expliqueront qu'il vaut mieux utiliser comme clé primaire une colonne de type INT auto incrémentée.
    Dans mon cas, ce n'est pas possible, il vaut mieux travailler avec le matricule de l'étudiant qui est comme un numéro de client.

    Ta colonne 'Matricule' peut être de type CHAR(6) comme suggéré
    Oui j'ai fais comme ça.

    par ailleurs si tu es sûr que le matricule ne dépassera jamais 6 caractères.
    oui sûr et certain.


    Elle peut de plus (c'est conseillé puisque c'est sur elle que s'effectuera la recherche) être un INDEX à contrainte UNIQUE.
    Là je vais faire une recherche sur google pour savoir ce que s'est.

    La raison invoquée pour le choix du type de la clé primaire est la performance. Mais si dans ton cas, tu n'as pas des dizaines de milliers de matricules à gérer, le gain de performance avec une clé primaire de type INT sera peut-être négligeable. Auquel cas tu peux effectivement prendre le matricule comme clé primaire, mais pas avec le type TINYTEXT.
    J'ai 388 étudiants à gérer

    Merci pour tout.

    beegees

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

Discussions similaires

  1. [Access] Problème avec REPLACE dans SQL
    Par nikolla dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/01/2011, 13h47
  2. Réponses: 10
    Dernier message: 08/07/2006, 11h12
  3. Problème avec les curseurs SQL SERVER
    Par stefostillrise dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2005, 13h09
  4. [ODBC] Problème avec odbc et sql server 2005
    Par scaleo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/10/2005, 09h49
  5. [SQL Server]Problème avec l'authentification SQL SERVER
    Par tidou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/04/2005, 15h40

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