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

SQL Procédural MySQL Discussion :

Problème de clés étrangères


Sujet :

SQL Procédural MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 179
    Points : 50
    Points
    50
    Par défaut Problème de clés étrangères
    Bonsoir,

    Dans le cas, ou les différentes tables sont crées de cette manière :
    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
    /*Création de la table tChannel*/
    CREATE TABLE `tChannel` (
      `channel_i_id` INTEGER(2) UNSIGNED NOT NULL,	/*l'identifiant du canal*/
      `channel_s_label` VARCHAR(100) NOT NULL default '',	/*le libellé du canal : MMS, GP ou Services*/	
      PRIMARY KEY  (`channel_i_id`)
    ) TYPE=InnoDB;
     
    /*Insertion dans la table tChannel*/
    INSERT INTO tChannel (`channel_i_id`, `channel_s_label`) VALUES (1, 'MMS');
    INSERT INTO tChannel (`channel_i_id`, `channel_s_label`) VALUES (2, 'GP');
    INSERT INTO tChannel (`channel_i_id`, `channel_s_label`) VALUES (3, 'Services');
     
     
    /*Création de la table tService*/
    CREATE TABLE `tService` (
      `service_i_id` INTEGER(3) UNSIGNED NOT NULL,	/*l'identifiant du service demandeur*/
      `service_s_label` VARCHAR(255) NOT NULL,	/*libellé du service demandeur*/
      `service_s_client_login` VARCHAR(255) NOT NULL,	/*l'identifiant côté client*/
      `service_s_client_password` VARCHAR(255) NOT NULL,	/*le mot de passe côté client*/
      PRIMARY KEY  (`service_i_id`),
      UNIQUE KEY (`service_s_client_login`)
    ) TYPE=InnoDB;
     
    -- Service demandeur mock, nécessaire pour le referencement de la clé étrangère de tSource
    INSERT INTO tService (`service_i_id`, `service_s_label`, `service_s_client_login`, `service_s_client_password`) VALUES (0, 'Dummy Service', '', '');
    INSERT INTO tService (`service_i_id`, `service_s_label`, `service_s_client_login`, `service_s_client_password`) VALUES (1, 'Messagerie SFR', 'sfrmes', 'test');
     
    /*Création de la table tSource*/
    CREATE TABLE `tSource` (
      `source_i_id` INTEGER(3) UNSIGNED NOT NULL,	/*l'identifiant de la source*/
      `channel_i_id` INTEGER(2) NOT NULL,	/*clé étrangère(channel)*/
      `service_i_id` INTEGER(3) NOT NULL,	/*pas une clé étrangère. Peut prendre la valeur vide (pour channel_i_id appartenant à {1;2} c'est à dire pour MMS et GP*/
      `source_s_label` VARCHAR(255) NOT NULL,	/*le libellé de la source : MMS, GP ou libelle du service demandeur*/
      PRIMARY KEY  (`source_i_id`)
      /*FOREIGN KEY(channel_i_id) REFERENCES tChannel(channel_i_id),
      FOREIGN KEY(service_i_id) REFERENCES tService(service_i_id) */
    ) TYPE=InnoDB;
    J'obtiens :
    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
    mysql> source mdd.sql
    Query OK, 0 rows affected (0.03 sec)
     
    Query OK, 1 row affected (0.00 sec)
     
    Query OK, 1 row affected (0.01 sec)
     
    Query OK, 1 row affected (0.00 sec)
     
    Query OK, 0 rows affected (0.02 sec)
     
    Query OK, 1 row affected (0.01 sec)
     
    Query OK, 1 row affected (0.00 sec)
     
    Query OK, 0 rows affected (0.03 sec)
    Tandis que lorsque j'introduit des clés étrangères dans la table tSource, ça ne fonctionne plus :
    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
    /*Création de la table tChannel*/
    CREATE TABLE `tChannel` (
      `channel_i_id` INTEGER(2) UNSIGNED NOT NULL,	/*l'identifiant du canal*/
      `channel_s_label` VARCHAR(100) NOT NULL default '',	/*le libellé du canal : MMS, GP ou Services*/	
      PRIMARY KEY  (`channel_i_id`)
    ) TYPE=InnoDB;
     
    /*Insertion dans la table tChannel*/
    INSERT INTO tChannel (`channel_i_id`, `channel_s_label`) VALUES (1, 'MMS');
    INSERT INTO tChannel (`channel_i_id`, `channel_s_label`) VALUES (2, 'GP');
    INSERT INTO tChannel (`channel_i_id`, `channel_s_label`) VALUES (3, 'Services');
     
     
    /*Création de la table tService*/
    CREATE TABLE `tService` (
      `service_i_id` INTEGER(3) UNSIGNED NOT NULL,	/*l'identifiant du service demandeur*/
      `service_s_label` VARCHAR(255) NOT NULL,	/*libellé du service demandeur*/
      `service_s_client_login` VARCHAR(255) NOT NULL,	/*l'identifiant côté client*/
      `service_s_client_password` VARCHAR(255) NOT NULL,	/*le mot de passe côté client*/
      PRIMARY KEY  (`service_i_id`),
      UNIQUE KEY (`service_s_client_login`)
    ) TYPE=InnoDB;
     
    -- Service demandeur mock, nécessaire pour le referencement de la clé étrangère de tSource
    INSERT INTO tService (`service_i_id`, `service_s_label`, `service_s_client_login`, `service_s_client_password`) VALUES (0, 'Dummy Service', '', '');
    INSERT INTO tService (`service_i_id`, `service_s_label`, `service_s_client_login`, `service_s_client_password`) VALUES (1, 'Messagerie SFR', 'sfrmes', 'test');
     
    /*Création de la table tSource*/
    CREATE TABLE `tSource` (
      `source_i_id` INTEGER(3) UNSIGNED NOT NULL,	/*l'identifiant de la source*/
      `channel_i_id` INTEGER(2) NOT NULL,	/*clé étrangère(channel)*/
      `service_i_id` INTEGER(3) NOT NULL,	/*clé étrangère(service)*/
      `source_s_label` VARCHAR(255) NOT NULL,	/*le libellé de la source : MMS, GP ou libelle du service demandeur*/
      PRIMARY KEY  (`source_i_id`),
      FOREIGN KEY(channel_i_id) REFERENCES tChannel(channel_i_id),
      FOREIGN KEY(service_i_id) REFERENCES tService(service_i_id)
    ) TYPE=InnoDB;
    J'obtiens :
    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
    mysql> source mdd.sql
    Query OK, 0 rows affected (0.03 sec)
     
    Query OK, 1 row affected (0.00 sec)
     
    Query OK, 1 row affected (0.01 sec)
     
    Query OK, 1 row affected (0.00 sec)
     
    Query OK, 0 rows affected (0.04 sec)
     
    Query OK, 1 row affected (0.00 sec)
     
    Query OK, 1 row affected (0.00 sec)
     
    ERROR 1005: Can't create table 'tSource.frm' (errno: 150)
    J'ai une version Mysql 4.
    Est-ce que quelqu'un pourrait m'indiquer comment faire en sorte que cette erreur ne soit plus présente avec ma version MySQL 4.

    Merci

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 902
    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 902
    Points : 6 026
    Points
    6 026
    Par défaut
    Les FK doivent être du même type que les colonnes qu'elles référencent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `channel_i_id` INTEGER(2) UNSIGNED NOT NULL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `channel_i_id` INTEGER(2) NOT NULL
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/09/2014, 09h36
  2. Problème de Clès étrangère
    Par waldpest dans le forum Débuter
    Réponses: 10
    Dernier message: 18/11/2010, 03h04
  3. Problèmes clés étrangères
    Par romaix21 dans le forum SQL
    Réponses: 1
    Dernier message: 29/02/2008, 11h46
  4. Problème avec les clés étrangères
    Par PoichOU dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 06/11/2007, 09h46
  5. Problème création clés étrangères
    Par sat478 dans le forum Débuter
    Réponses: 1
    Dernier message: 01/05/2006, 15h53

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