Gestion des clés etrangères sous mysql

ikramta Messages postés 151 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 10 février 2016 - 18 févr. 2009 à 12:26
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 21 févr. 2009 à 11:41
bonjour tout le monde et bon courage.$
bon depuis pas mal de temps que je suis entrain
de cherché comment creé des clés etrangé sous mysql,
dans le site officiel de mysql il on dit que :
le type INNODB comprend les clé etrangé .
par exemple:
create table chambre(id_ch int(10) not null auto_increment,numero_ch smallint(6) unsigned not null,etage smallint(6) unsigned not null,description_ch text,tarif_extrat decimal(6,6) unsigned,statut_ch enum('v','f'),id_type int(10),hotel varchar(100),primary key (id_ch) ,constraint id_type foreign key(id_type)references type_chambre(id_type) on update cascade,constraint hotel foreign key(hotel)references hotel(hotel) on update cascade)type INNODB;
quand j'excute cet syntaxe elle ne me donne pas le hotel et type_ch comme des clé etrangé mais elle me donne que sont des indexe .
pouvez vous me dire comment je peut resoudre ce problème ou bien pas de différence entre index et foreign key (bon mes information ditent q'il ya une large difference).
merci d'avance et salut.

3 réponses

gr43 Messages postés 95 Date d'inscription mardi 20 mai 2008 Statut Membre Dernière intervention 8 septembre 2010
18 févr. 2009 à 16:05
Salut, toutes les contraintes (primaires, unicité, étrangères) sont gérés par le sgbd par des index.
Si tu insère des données dans ta table avec un champ hotel qui ne référence pas le champ hotel de la table hotel tu devrais avoir une erreur de contrainte de clé étrangère
0
ikramta Messages postés 151 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 10 février 2016
18 févr. 2009 à 17:35
salut gr43 et merci bien mais j'utilise easyphp version1.8 et il m'affiche ls clés primaire comme des primaires mais les étrangés comme je t'ai dit des index mais dans le script de creation de ma table je lui dit en update cascade et j'ai changé expré le nom hotel dans la table hotel et rien n'est changé dans la table chambre. et quand j'ai fait l'ingenieurie inverse avec DBDesigner il ne m'affiche aucune integritées entre les pages.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
21 févr. 2009 à 11:41
Bonjour,

D'une manière générale :
1- ne pas donner aux contraintes le même nom qu'un champ existant ou qu'un index. Le SGBD risque fort de ne pas comprendre et de s'emmêler les pinceaux.
2- Penses à préfixer les identifiants de contraintes de clé étrangère par FK_ comme on le préconise et les index par IDX_. C'est une bonne habitude à prendre et ça évitera de chercher pourquoi ça ne fonctionne pas.

3- Un index n'a rien à voir avec une clé étrangère, du moins de près.

Voici donc le DDL modifié :

CREATE TABLE chambre (
  id_ch          INT(10)    NOT NULL    AUTO_INCREMENT,
  numero_ch      SMALLINT(6) UNSIGNED    NOT NULL,
  etage          SMALLINT(6) UNSIGNED    NOT NULL,
  description_ch TEXT,
  tarif_extrat   DECIMAL(6,6) UNSIGNED,
  statut_ch      ENUM('v','f'),
  id_type        INT(10),
  hotel          VARCHAR(100),
     PRIMARY KEY ( id_ch ),
  CONSTRAINT FK_id_type FOREIGN KEY ( id_type ) REFERENCES type_chambre(id_type) ON UPDATE CASCADE,
  CONSTRAINT FK_hotel FOREIGN KEY ( hotel ) REFERENCES hotel(hotel) ON UPDATE CASCADE)
TYPE INNODB;
A plus...
May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0