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 :

Création de contrainte de clé étrangère


Sujet :

MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Création de contrainte de clé étrangère
    Bonjour à tous tout d'abord.

    Voila, je débute sous mysql et je rencontre un problème que je n'arrive pas à résoudre, je m'explique :

    Aprés avoir créer mes tables et aprés avoir remplie celle-ci de données, je n'arrive pas à faire les contraintes, le logiciel me repond :
    Erreur

    requête SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE JOUE_DANS ADD CONSTRAINT FK_JOUE_DANS FOREIGN KEY ( REFACTEUR ) REFERENCES ACTEUR( REFACTEUR ) ;
    MySQL a répondu : Documentation
    #1005 - Ne peut créer la table 'film.#sql-1484_3d' (Errcode: 121)
    et il le fait en gros pour chaque contrainte, le fait est que je ne suit pas sur de faire les choses comme il faut donc je sollicite votre aide.

    Voici la creation de mes tables :

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    drop table if exists CLIENT;
    drop table if exists JOUE_DANS;
    drop table if exists FILM;
    drop table if exists REALISATEUR;
    drop table if exists REALISE;
    drop table if exists EDITEUR;
    drop table if exists EMPRUNTEE_PAR;
    drop table if exists GENRE;
    drop table if exists ACTEUR;
    /*==============================================================*/
    /* Table : CLIENT                                               */
    /*==============================================================*/
    create table CLIENT(
       REFCLIENT            numeric(8) not null,
       NOMCLIENT            varchar(25),
       PRENOMCLIENT         varchar(25),
       ADRESSCLIENT         varchar(50),
       CPCLIENT             numeric(6,0),
       VILLECLIENT          varchar(25),
       TELCLIENT            varchar(10),
       primary key (REFCLIENT)
    );
    /*==============================================================*/
    /* Table : JOUE_DANS                                            */
    /*==============================================================*/
    create table JOUE_DANS(
       REFACTEUR            numeric(8) not null,
       REFFILM              numeric(8) not null,
       primary key (REFACTEUR, REFFILM)
    );
    /*==============================================================*/
    /* Table : FILM                                                 */
    /*==============================================================*/
    create table FILM(
       REFFILM              numeric(8) not null,
       REFGENRE             numeric(8) not null,
       REFEDITEUR           numeric(8) not null,
       TITREFILM            varchar(100),
       ANNEEPRODUCTION      numeric(4,0),
       primary key (REFFILM)
    );
    /*==============================================================*/
    /* Table : ACTEUR                                               */
    /*==============================================================*/
    create table ACTEUR(
       REFACTEUR            numeric(8) not null,
       NOMACTEUR            varchar(25),
       PRENOMACTEUR         varchar(25),
       NATIOACTEUR          varchar(25),
       primary key (REFACTEUR)
    );
    /*==============================================================*/
    /* Table : REALISE                                              */
    /*==============================================================*/
    create table REALISE(
       REFREAL              numeric(8) not null,
       REFFILM              numeric(8) not null,
       primary key (REFREAL, REFFILM)
    );
    /*==============================================================*/
    /* Table : EDITEUR                                              */
    /*==============================================================*/
    create table EDITEUR(
       REFEDITEUR           numeric(8) not null,
       NOMEDITEUR           varchar(25),
       primary key (REFEDITEUR)
    );
    /*==============================================================*/
    /* Table : EMPRUNTEE_PAR                                        */
    /*==============================================================*/
    create table EMPRUNTEE_PAR(
       REFCLIENT              numeric(8) not null,
       REFFILM                numeric(8) not null,
       DATEMPRUNT           date,
       primary key (REFCLIENT, REFFILM)
    );
    /*==============================================================*/
    /* Table : GENRE                                                */
    /*==============================================================*/
    create table GENRE(
       REFGENRE             varchar(8) not null,
       NOMGENRE             varchar(25),
       primary key (REFGENRE)
    );
    /*==============================================================*/
    /* Table : REALISATEUR                                          */
    /*==============================================================*/
    create table REALISATEUR(
       REFREAL              numeric(8) not null,
       NOMREAL              varchar(25),
       PRENOMREAL           varchar(25),
       NATIOREAL            varchar(25),
       primary key (REFREAL)
    );
    Ainsi que les données :

    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
    insert into Film (REFFILM, REFGENRE, REFEDITEUR, TITREFILM, ANNEEPRODUCTION) values
    ('01', '03', '10', 'La verite si je ment','2007'), 
    ('02', '04', '10', 'Entre les murs','2009'), 
    ('03', '01', '04', 'Hancock','2009'), 
    ('04', '05', '09', 'Wall_e','2009'), 
    ('05', '05', '05', 'Kung fu panda','2009'), 
    ('06', '03', '01', 'Bienvenue chez les chtis','2002');
     
     
    insert into acteur (REFACTEUR, NOMACTEUR, PRENOMACTEUR, NATIOACTEUR) values
    ('01', 'Solo', 'Bruno', 'Francais'), 
    ('02', 'Smith', 'Will', 'Americain');
     
    insert into REALISATEUR (REFREAL, NOMREAL, PRENOMREAL, NATIOREAL) values
    ('01', 'Gilou', 'Thomas', 'Francais'),
    ('02', 'Berg', 'Peter', 'Anglais');
     
    insert into editeur (REFEDITEUR, NOMEDITEUR) values
    ('01', 'Pathe'), ('02', 'Universal'), ('03', 'Canal_plus'), 
    ('04', 'Colombia'), ('05', 'Dreamworks'), ('06', 'TF1'), 
    ('07', 'Virgin'), ('08', 'Warner'),('09', 'Disney'), 
    ('10', 'France_television'), ('11', 'Metropolitan');
     
     
    insert into genre (REFGENRE, NOMGENRE) values
    ('01', 'Action'), ('02', 'Science-Fiction'),('03', 'Humour'), 
    ('04', 'Biographie'), ('05', 'Dessin_animé'), ('06', 'Horreur');
     
     
    insert into CLIENT (REFCLIENT, NOMCLIENT, PRENOMCLIENT, ADRESSCLIENT, CPCLIENT, VILLECLIENT, TELCLIENT) values
    ('01', 'MARTIN', 'Jacques', '18, rue Jules moulet', '13006', 'Marseille', '0693561204'), 
    ('02', 'GIRARD', 'Hugues', '24, bv notre dame', '13006', 'Marseille', '0693561205'), 
    ('03', 'DUTANG', 'Patrick', '45, quai du port', '13001', 'Marseille', '0693561206'), 
    ('04', 'PINVIN', 'Florence', '54, rue des magnolias', '13015', 'Marseille', '0693561207'), 
    ('05', 'MANTIN', 'Olivier', '12, rue de la joliette', '13003', 'Marseille', '0693561208'), 
    ('06', 'MONNET', 'Yann', '56, bd larrat', '13010', 'Marseille', '0693561224');
     
     
    insert into empruntee_par (REFCLIENT, REFFILM, DATEMPRUNT) values
    ('01', '05', '2009/02/24'), 
    ('06', '01', '2008/12/12');
    Enfin, les contraintes :

    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
    alter table JOUE_DANS add constraint FK_JOUE_DANS foreign key (REFACTEUR)
          references ACTEUR (REFACTEUR);
     
    alter table JOUE_DANS add constraint FK_JOUE_DANS2 foreign key (REFFILM)
          references FILM (REFFILM);
     
    alter table FILM add constraint FK_EDITE_PAR foreign key (REFEDITEUR)
          references EDITEUR (REFEDITEUR);
     
    alter table FILM add constraint FK_EST_DE foreign key (REFGENRE)
          references GENRE (REFGENRE);
     
    alter table REALISE add constraint FK_REALISE foreign key (REFREAL)
          references REALISATEUR (REFREAL);
     
    alter table REALISE add constraint FK_REALISE2 foreign key (REFFILM)
          references FILM (REFFILM);
     
    alter table EMPRUNTEE_PAR add constraint FK_EMPRUNTEE_PAR foreign key (REFCLIENT)
          references CLIENT (REFCLIENT);
     
    alter table EMPRUNTEE_PAR add constraint FK_EMPRUNTEE_PAR2 foreign key (REFFILM)
          references FILM (REFFILM);
    Désolé pour la longueure.
    Merci.

  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 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour et bienvenue sur le forum ,

    Une remarque en regardant rapidement ton script d'insertion des données : sur tous les champs clefs de tes tables, qui sont définis comme des numériques, tu fais une insertion de chaînes de caractères (valeurs entourées de quotes ').
    Il vaut mieux l'éviter, parce que ça force MySQL à faire une conversion implicite. Enlève les quotes et les 0.
    Ensuite, le type NUMERIC est équivalent au type DECIMAL, c'est à dire un nombre à virgules avec une précision données. Or, dans ton cas, ce sont des entiers. Donc, il vaut mieux que le type de ces champs soit INT.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Malgrés cette amélioration, toujours le même problème
    merci de votre accueil et de votre réponse.

    Aprés avoir remplacer les champs numéric par des int, et aprés avoir supprimer les quotes et 0, sur les valeurs qui ne le nécessitées pas, le même problème persiste lors des contraintes, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE FILM 
    ADD CONSTRAINT FK_EST_DE FOREIGN KEY ( REFGENRE )  REFERENCES GENRE( REFGENRE ) ;
    MySQL a répondu: Documentation
    #1005 - Ne peut créer la table 'film.#sql-1484_81' (Errcode: 150)

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Petite evolution
    Je précise avant tout que le message d'erreur précédent se produis sous easyphp.
    En passant sous mysql, et en y écrivant les tables puis les données et enfin les contraintes(vu plus haut), il ne signale aucun problème mais lorsque je lance la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select titrefilm 
    from genre, film 
    where refgenre.genre=refgenre.film;
    il me sort comme message d'erreur :
    Unknown column 'refgenre.genre' in 'where clause'
    et je me demande si cela ne vient pas encore du probleme de contrainte rencontrer dans easyphp, qui dans mysql n'est présent que lors d'une requête.
    (Ca peut aussi venir du fait que je suis une quiche en mysql).

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    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 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Pour ton dernier problème, je pense que ça marchera mieux avec table.colonne qu'avec colonne.table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select titrefilm 
    from genre, film 
    where genre.refgenre = film.refgenre ;
    Par ailleurs, il serait préférable de normaliser la jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select titrefilm 
    from genre
      inner join film on genre.refgenre = film.refgenre ;
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select titrefilm 
    from genre G
      inner join film F on G.refgenre = F.refgenre ;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Cela fonctionne
    Merci beaucoup pour votre efficacité, cela marche trés bien.

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

Discussions similaires

  1. Double contrainte de clé étrangère
    Par eperdu dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 21/04/2010, 15h49
  2. [SBI JR] création de contraintes
    Par Benoit_Durand dans le forum SpagoBI
    Réponses: 4
    Dernier message: 27/08/2007, 15h16
  3. [Débutant ACCESS] Contrainte de clés étrangères
    Par elgringo2007 dans le forum Access
    Réponses: 2
    Dernier message: 12/06/2006, 18h56
  4. Réponses: 5
    Dernier message: 28/04/2006, 11h55
  5. Contraintes de clés étrangères non respectées
    Par parfait dans le forum Requêtes
    Réponses: 7
    Dernier message: 28/07/2004, 12h48

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