Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/11/2007, 21h56   #1
Membre à l'essai
 
Inscription : janvier 2007
Messages : 179
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 179
Points : 20
Points : 20
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 :
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 :
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 :
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 :
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
parano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2007, 09h50   #2
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Les FK doivent être du même type que les colonnes qu'elles référencent

Code :
`channel_i_id` INTEGER(2) UNSIGNED NOT NULL
Code :
`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
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h17.


 
 
 
 
Partenaires

Hébergement Web