|
Membre à l'essai
Inscription : janvier 2007 Messages : 179 Détails du profil  Informations forums : Inscription : janvier 2007 Messages : 179 Points : 20 Points : 20
|
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
|