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

 MySQL Discussion :

Foreign keys apprendre


Sujet :

MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut Foreign keys apprendre
    Bonjour a tous,


    voila je débute complètement en MYSQL et j'ai besoin de savoir si je vais pas une erreur.

    je suis occuper a essaye de faire une base avec les code postaux + ville + pays et ce en 6 langues

    voici mon code sql.

    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';


    -- -----------------------------------------------------
    -- Table `pays`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `pays` ;

    SHOW WARNINGS;
    CREATE TABLE IF NOT EXISTS `pays` (
    `idpays` INT NOT NULL AUTO_INCREMENT ,
    `paysfr` VARCHAR(100) NOT NULL ,
    `paysen` VARCHAR(100) NOT NULL ,
    `paysit` VARCHAR(100) NOT NULL ,
    `paysde` VARCHAR(100) NOT NULL ,
    `paysnl` VARCHAR(100) NOT NULL ,
    `payses` VARCHAR(100) NOT NULL ,
    `payspt` VARCHAR(100) NOT NULL ,
    PRIMARY KEY (`idpays`) )
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;

    SHOW WARNINGS;

    -- -----------------------------------------------------
    -- Table `ville`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `ville` ;

    SHOW WARNINGS;
    CREATE TABLE IF NOT EXISTS `ville` (
    `idville` INT NOT NULL AUTO_INCREMENT ,
    `villefr` VARCHAR(150) NOT NULL ,
    `paysfr` VARCHAR(100) NOT NULL ,
    `villeen` VARCHAR(150) NOT NULL ,
    `paysen` VARCHAR(100) NOT NULL ,
    `villeit` VARCHAR(150) NOT NULL ,
    `paysit` VARCHAR(100) NOT NULL ,
    `villede` VARCHAR(150) NOT NULL ,
    `paysde` VARCHAR(100) NOT NULL ,
    `villenl` VARCHAR(150) NOT NULL ,
    `paysnl` VARCHAR(100) NOT NULL ,
    `villees` VARCHAR(150) NOT NULL ,
    `payses` VARCHAR(100) NOT NULL ,
    `villept` VARCHAR(150) NOT NULL ,
    `payspt` VARCHAR(100) NOT NULL ,
    PRIMARY KEY (`idville`) ,
    CONSTRAINT `paysfr`
    FOREIGN KEY (`paysfr` )
    REFERENCES `mydb`.`pays` (`paysfr` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `paysen`
    FOREIGN KEY (`paysen` )
    REFERENCES `mydb`.`pays` (`paysen` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `paysit`
    FOREIGN KEY (`paysit` )
    REFERENCES `mydb`.`pays` (`paysit` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `paysde`
    FOREIGN KEY (`paysde` )
    REFERENCES `mydb`.`pays` (`paysde` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `paysnl`
    FOREIGN KEY (`paysnl` )
    REFERENCES `mydb`.`pays` (`paysnl` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `payses`
    FOREIGN KEY (`payses` )
    REFERENCES `mydb`.`pays` (`payses` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `payspt`
    FOREIGN KEY (`payspt` )
    REFERENCES `mydb`.`pays` (`payspt` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;

    SHOW WARNINGS;
    CREATE INDEX `paysfr` ON `ville` (`paysfr` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `paysen` ON `ville` (`paysen` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `paysit` ON `ville` (`paysit` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `paysde` ON `ville` (`paysde` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `paysnl` ON `ville` (`paysnl` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `payses` ON `ville` (`payses` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `payspt` ON `ville` (`payspt` ASC) ;

    SHOW WARNINGS;

    -- -----------------------------------------------------
    -- Table `cpostaux`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `cpostaux` ;

    SHOW WARNINGS;
    CREATE TABLE IF NOT EXISTS `cpostaux` (
    `idcpostaux` INT NOT NULL AUTO_INCREMENT ,
    `cp` VARCHAR(15) NOT NULL ,
    `villefr` VARCHAR(150) NOT NULL ,
    `villeen` VARCHAR(150) NOT NULL ,
    `villeit` VARCHAR(150) NOT NULL ,
    `villede` VARCHAR(150) NOT NULL ,
    `villenl` VARCHAR(150) NOT NULL ,
    `villees` VARCHAR(150) NOT NULL ,
    `villept` VARCHAR(150) NOT NULL ,
    PRIMARY KEY (`idcpostaux`) ,
    CONSTRAINT `villefr`
    FOREIGN KEY (`villefr` )
    REFERENCES `mydb`.`ville` (`villefr` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `villeen`
    FOREIGN KEY (`villeen` )
    REFERENCES `mydb`.`ville` (`villeen` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `villeit`
    FOREIGN KEY (`villeit` )
    REFERENCES `mydb`.`ville` (`villeit` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `villede`
    FOREIGN KEY (`villede` )
    REFERENCES `mydb`.`ville` (`villede` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `villenl`
    FOREIGN KEY (`villenl` )
    REFERENCES `mydb`.`ville` (`villenl` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `villees`
    FOREIGN KEY (`villees` )
    REFERENCES `mydb`.`ville` (`villees` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
    CONSTRAINT `villept`
    FOREIGN KEY (`villept` )
    REFERENCES `mydb`.`ville` (`villefr` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci;

    SHOW WARNINGS;
    CREATE INDEX `villefr` ON `cpostaux` (`villefr` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `villeen` ON `cpostaux` (`villeen` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `villeit` ON `cpostaux` (`villeit` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `villede` ON `cpostaux` (`villede` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `villenl` ON `cpostaux` (`villenl` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `villees` ON `cpostaux` (`villees` ASC) ;

    SHOW WARNINGS;
    CREATE INDEX `villept` ON `cpostaux` (`villept` ASC) ;

    SHOW WARNINGS;


    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    Merci d'avance pour vos réponse et conseil.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Ta modélisation part sur les mauvais principes. Tes entités de base sont la ville et le pays. Le code postal est un attribut de la ville. Les noms de pays et de villes sont des attributs des entités correspondantes ; mais plutôt que de créer six colonnes à chaque fois, il est plus intéressant et plus simple de considérer que tu as une entité Langue. Du coup, les noms deviennent des associations entre Pays et Langue d'une part, Ville et Langue d'autre part.

    Plus concrètement, ça donne donc :
    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
    create table Pays (
      IDpays int primary key
      ) ;
    create table Villes (IDville int primary key, 
      codepostal varchar(10), 
      IDpays int references pays (IDpays)
      ) ;
    create table Langues(
      IDlangue int primary key, 
      langue varchar(20)
      ) ;
    create table NomsPays(
      IDpays int references Pays(IDpays),
      IDlangue int references Langues(IDlangue),
      NomPays varchar(100) not null,
      primary key (IDpays, IDlangue) 
    ) ;
    create table NomsVilles(
      IDville int references Villes(IDville),
      IDlangue int references Langues(IDlangue),
      NomVille varchar(150) not null,
      primary key (IDville, IDlangue) 
    ) ;
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Merci pour ta réponse et je vais de ce pas l'installer sur ma base et la travailler.

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Un code postal peut différer pour les grandes villes où il y a des arrondissements, comme paris et marseille, je crois qu'il faut prendre en compte ce paramètre.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Xunil Voir le message
    Un code postal peut différer pour les grandes villes où il y a des arrondissements, comme paris et marseille, je crois qu'il faut prendre en compte ce paramètre.

    tu sais m'éclairer sur cela et me dire si je dois modifier les tables de notre modérateur.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Citation Envoyé par Xunil Voir le message
    Un code postal peut différer pour les grandes villes où il y a des arrondissements, comme paris et marseille, je crois qu'il faut prendre en compte ce paramètre.
    Et réciproquement, plusieurs (petites) villes peuvent correspondre au même code postal. Donc si on veut être très formel, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE TABLE Villes (
      IDville int PRIMARY KEY, 
      IDpays int REFERENCES pays (IDpays)
      ) ;
    CREATE TABLE CodesPostaux (
      CodePostal varchar(15) PRIMARY KEY
    ) ;
    CREATE TABLE Attribution_CP (
      IDville REFERENCES Villes(IDville),
      CodePostal varchar(15) REFERENCES CodesPostaux(CodePostal),
      PRIMARY KEY (IDville, CodePostal) 
    ) ;
    Le reste ne change pas.
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    merci pour votre aide precieuse,

    voila j'ai essaye d'installer la modification porter suite au probleme de code postaux et j'ai une erreur.

    voici le code sql que j'ai essaye de mettre

    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
    CREATE TABLE Pays (
      IDpays int PRIMARY KEY
    ) ;
     
    CREATE TABLE Langues(
      IDlangue int PRIMARY KEY, 
      langue varchar(20)
    ) ;
     
    CREATE TABLE NomsPays(
      IDpays int REFERENCES Pays(IDpays),
      IDlangue int REFERENCES Langues(IDlangue),
      NomPays varchar(100) NOT NULL,
      PRIMARY KEY (IDpays, IDlangue) 
    ) ;
     
    CREATE TABLE NomsVilles(
      IDville int REFERENCES Villes(IDville),
      IDlangue int REFERENCES Langues(IDlangue),
      NomVille varchar(150) NOT NULL,
      PRIMARY KEY (IDville, IDlangue) 
    ) ;
     
    CREATE TABLE Villes (
      IDville int PRIMARY KEY, 
      IDpays int REFERENCES pays (IDpays)
    ) ;
     
    CREATE TABLE CodesPostaux (
      CodePostal varchar(15) PRIMARY KEY
    ) ;
     
    CREATE TABLE Attribution_CP (
      IDville REFERENCES Villes(IDville),
      CodePostal varchar(15) REFERENCES CodesPostaux(CodePostal),
      PRIMARY KEY (IDville, CodePostal) 
    ) ;

    et voila le code 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 'REFERENCES Villes(IDville),
    CodePostal varchar(15) REFERENCES CodesPostaux(Co' at line 2
    merci pour votre aide.

    bon j'ai corriger un truc qui me semble etais cela le blem voici le sql

    CREATE TABLE Attribution_CP (
    IDville int REFERENCES Villes(IDville),
    CodePostal varchar(15) REFERENCES CodesPostaux(CodePostal),
    PRIMARY KEY (IDville, CodePostal)
    ) ;

    j'ai juste ajouter le int a IDville, j'espere que c'etais bien cela.

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Désolé, j'ai oublié de typer l'IDville dans la dernière table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE Attribution_CP (
      IDville int REFERENCES Villes(IDville),
      CodePostal varchar(15) REFERENCES CodesPostaux(CodePostal),
      PRIMARY KEY (IDville, CodePostal) 
    ) ;
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    merci antoun pour ta réponse rapide, j'avais aussi retrouver la meme erreur et ca me fais plaisir que j'ai trouver cela et que tu m'a confirmer , ainsi j'apprend doucement.

    maintenant lors d'un insert into j'ai un soucis voici le code sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO NomsPays (Idpays, Idlangue, NomPays) 
    VALUES (44,'1','Congo (la Rép. dém. du) (ex-Zaïre)	');
    bon je sais que ca viens de la partie Congo (la Rép. dém. du) (ex-Zaïre) comment je pourrais faire pour que ca passe autrement que ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO NomsPays (Idpays, Idlangue, NomPays) 
    VALUES (44,'1','la Rép. dém. du Congo ');

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    bonjour a tous denouveau,

    voila je continue la suite de ma base et je voudrais que vous m'aidiez doucement si je vais des erreurs de débutant.

    j'ai créé une table drapeaux que voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE  TABLE IF NOT EXISTS `drapeaux` (
      `IDdrapeaux` INT NOT NULL DEFAULT '0',
      `drapeau` VARCHAR(255) NOT NULL DEFAULT '0',
      `IDpays` INT NOT NULL DEFAULT '0',
      PRIMARY KEY (`IDpays`,'IDdrapeaux') 
    ENGINE = MyISAM DEFAULT CHARSET=latin1;
    bon la partie drapeaux sera des lien web ou se trouvera les images des drapeaux, je pense que c'est bien le lien iddrapeau va voir directement idpays pour etre identique.

    merci pour votre réponse.

  11. #11
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Salut,

    Tu ne peux pas mettre un default 0 sur une pk, tu rencontreras tôt ou tard une erreur.
    Cette colonne devrait-être en auto_increment.

    Les valeurs par défaut ne doivent-être utilisées que pour les champs qui sont optionnels lors de l'insertion, ce n'est le cas pour aucune de tes colonnes.

    Tu dois utiliser de l'innodb si tu veux utiliser des contraintes, ta table en a une, l'idpays.

    Après, est-ce nécessaire de faire une table pour les drapeaux ?
    1 drapeau = 1 pays non ?

    À moins que tu n'y mettes aussi tous les drapeaux régionaux

    Pour ton message précédent, je n'ai pas compris où était le problème.

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    Salut et merci pour ta réponse,

    voila pour mon problème précédent j'arrivais pas a insérer ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO NomsPays (Idpays, Idlangue, NomPays) 
    VALUES (44,'1','Congo (la Rép. dém. du) (ex-Zaïre) ');
    je me suis dis que je devais corrigé cela et mettre ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO NomsPays (Idpays, Idlangue, NomPays) 
    VALUES (44,'1','la Rép. dém. du Congo  ');
    et ca a marché

    pour ce qui est des drapeaux en faite, lorsque je verais un article par exemple venant de la france , il y aie le drapeaux francais pour faire savoir que c'est un article du pays france.


    donc pour toi ma table devrais etre ceci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS `drapeaux` (
    `IDdrapeaux` INT NOT NULL ,
    `drapeau` VARCHAR(255) NOT NULL ,
    `IDpays` INT NOT NULL ,
    PRIMARY KEY (`IDpays`,'IDdrapeaux')
    ENGINE = MyISAM DEFAULT CHARSET=latin1;

    Maintenant je viens de voir sur mes insert que des caractères ne ce copie pas correctement c'est du au faite que j'ai mis latin1, devrais-je pas mettre uft8 a la place?

  13. #13
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Non, pourquoi mettre une pk sur l'id et le drapeau ?

    Cela n'empêchera pas d'avoir un drapeau en double.

    Plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE IF NOT EXISTS drapeaux (
        IDdrapeaux INT NOT NULL AUTO_INCREMENT,
        drapeau VARCHAR(255) NOT NULL,
        IDpays INT NOT NULL,
        PRIMARY KEY(IDdrapeaux),
        UNIQUE(drapeaux),
        CONSTRAINT drapeau_pays FOREIGN KEY(IDpays) REFERENCES Pays(IDpays)
    ) TYPE = INNODB;
    Pour le charset, c'est à toi de voir, si tu as l'intention d'utiliser des caractères autres que latin dans ton application, oui utilise utf8, mais dans la majorité des cas, on utilise de l'utf8 à mauvais escient, cela n'a pas que des avantages, au contraire même.

    Pas compris pourquoi ta requête ne fonctionne pas.
    Conseil, sers-toi de la console mysql plutôt que de phpmyadmin, c'est beaucoup plus instructif.

    Ps: utilise les balises codes du forum, quand tu en postes.

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    CREATE TABLE IF NOT EXISTS drapeaux (
    IDdrapeaux INT NOT NULL AUTO_INCREMENT,
    drapeau VARCHAR(255) NOT NULL,
    IDpays INT NOT NULL,
    PRIMARY KEY(IDdrapeaux),
    UNIQUE(drapeaux),
    CONSTRAINT drapeau_pays FOREIGN KEY IDpays REFERENCES Pays(IDpays)
    ) TYPE = INNODB;
    merci pour cette explication, malheureusement j'ai un soucis avec cette table car je sais pas l'intégrer a ma base. Toute les autres tables sont reprise au dessus et mise en MyISAM.

    Merci de votre aide encore.

  15. #15
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Citation Envoyé par ptiteuf Voir le message
    Salut et merci pour ta réponse,

    voila pour mon problème précédent j'arrivais pas a insérer ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO NomsPays (Idpays, Idlangue, NomPays) 
    VALUES (44,'1','Congo (la Rép. dém. du) (ex-Zaïre) ');
    je me suis dis que je devais corrigé cela et mettre ceci
    (...)
    Pas du tout, cela fonctionne sans problème chez moi - il n'y a d'ailleurs aucune raison que ça ne marche pas. Si tu as une erreur, peux-tu donner le message d'erreur ?
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  16. #16
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Citation Envoyé par ptiteuf Voir le message
    merci pour cette explication, malheureusement j'ai un soucis avec cette table car je sais pas l'intégrer a ma base. Toute les autres tables sont reprise au dessus et mise en MyISAM.
    Pour chaque table, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE nom_de_la_table ENGINE = InnoDB ;
    Ceci dit, je ne suis pas sûr de t'avoir vraiment aidé... l'impression que tu donnes est de ne rien connaître à la modélisation, qui est un domaine qui ne s'invente pas ! je te recommande donc de commencer par le début, et d'étudier précisément un cours sur le sujet... tu as par exemple celui-ci : ftp://ftp-developpez.com/cyril-gruau/ConceptionBD.pdf
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  17. #17
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    je débute dans le monde de la modélisation et de mysql, pour cela que j'étais dans la section débutant.

    Je viens de modifier toutes mes tables avec la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE nom_de_la_table ENGINE = InnoDB ;

    pas eue de message d'erreur et après j'ai voulu mettre la table drapeaux en place et la une erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE IF NOT EXISTS drapeaux (
    IDdrapeaux INT NOT NULL AUTO_INCREMENT,
    drapeau VARCHAR(255) NOT NULL,
    IDpays INT NOT NULL,
    PRIMARY KEY(IDdrapeaux),
    UNIQUE(drapeaux),
    CONSTRAINT drapeau_pays FOREIGN KEY IDpays REFERENCES Pays(IDpays)
    ) TYPE = INNODB;

    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 'REFERENCES Pays(IDpays) ) TYPE = INNODB' at line 7

    et merci pour le cour que je vais regarder des mon retour de boulot.

  18. #18
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    J'ai omis la paire de parenthèses du fk.

    Corrigé, dans le post concerné.

  19. #19
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 283
    Points : 11 742
    Points
    11 742
    Par défaut
    Citation Envoyé par ptiteuf Voir le message
    je débute dans le monde de la modélisation et de mysql, pour cela que j'étais dans la section débutant.
    (...)
    et merci pour le cour que je vais regarder des mon retour de boulot.
    J'entends bien, mais je voulais souligner qu'à mon sens, tu prenais les choses par le mauvais bout. Je pense qu'il serait plus efficace pour toi de lire le cours au boulot, quitte à commencer à développer à ton retour du boulot. Par exemple, comme Xunil l'a déjà souligné, a priori la table Drapeaux que tu t'échines à créer ne sert à rien, il suffit d'ajouter une colonne Drapeau dans la table Pays.

    Bon, après plus efficace ne veut pas forcément dire possible...

    PS : les balises QUOTE sont réservées aux citations. Pour le code, ce sont les balises CODE (le bouton # au-dessus de la fenêtre de message).
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  20. #20
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 42
    Points : 22
    Points
    22
    Par défaut
    voila j'ai copier la colonne drapeaux dans la table monpays et demain j'imprime le cours au boulot pou le travailler et je continuerais ma base avec votre aide.


    Merci encore.

Discussions similaires

  1. [FOREIGN KEY] petite question bete ...
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 16h35
  2. Probleme 'ALTER TABLE' et 'FOREIGN KEY'
    Par maahta dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/09/2003, 14h25
  3. [IB71] Je ne peux plus supprimer mes foreign key...
    Par BoeufBrocoli dans le forum InterBase
    Réponses: 3
    Dernier message: 19/09/2003, 14h39
  4. [postgresql][foreign key]
    Par elea1206 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/08/2003, 12h07
  5. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34

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