Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
917 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  clé étrangère avec MySQL [RESOLU]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

clé étrangère avec MySQL [RESOLU]

n°1096546
andlio
Posté le 25-05-2005 à 13:58:05  profilanswer
 

bonjour à tous !
 
j'ai créé une base de données sous MySQL 4.0.20.
elle a 3 tables : 'station' qui contient l'@ IP des stations de travail à tester sur le réseau, 'alerte' qui contient un historique de ttes les alertes reçues par les stations, et correspondance_OID qui contient le type d'alerte susceptibles d'être reçu.
 
j'ai bien défini les clé étrangères, mais celles-ci ne semble pas fonctionnées correctement.
en effet, lorsque je fais l'insertion suivante dans la table 'station' :

+--------------+------+--------+-----+-----+
|IP            |HOST  |OS      |PING |SNMP |
+--------------+------+--------+-----+-----+
|123.456.789.1 |NULL  |Windows |NULL |NULL |
+--------------+------+--------+-----+-----+


 
et cette insertion dans la table 'alerte' :

+--------------+------+--------+
|IP            |ID    |Date    |
+--------------+------+--------+
|456.789.012.1 |1     |25/0505 |
+--------------+------+--------+


 
il n'y a aucune erreur et les tuples s'insèrent normalement alors que les valeurs ne correspondent pas. Portant j'ai défini une clé primaire entre l'attribut IP de alerte et celui de station.
 
voici le script de création des tables :
 

Code :
  1. CREATE TABLE station (
  2. IP varchar(15),
  3. HOST varchar(32),
  4. OS varchar(32),
  5. PING varchar(3),
  6. SNMP varchar(3),
  7. constraint pk_station PRIMARY KEY (IP)
  8. );
  9. CREATE TABLE correspondance_oid (
  10. ID int(3),
  11. OS varchar(32),
  12. NOM varchar(32),
  13. TRAP_OID varchar(70),
  14. SIGNIFICATION varchar(32),
  15. ACTION varchar(32),
  16. NIVEAU int(1),
  17. constraint pk_correspondance PRIMARY KEY (ID),
  18. constraint unique_correspondance UNIQUE (OS, TRAP_OID)
  19. );
  20. CREATE TABLE alerte (
  21. IP varchar(15),
  22. ID int(3),
  23. Date varchar(32),
  24. constraint pk_alerte PRIMARY KEY (IP, ID, Date),
  25. constraint fk_alerte_station FOREIGN KEY (IP) REFERENCES station(IP) on delete cascade,
  26. constraint fk_alerte_correspondacne FOREIGN KEY (ID) REFERENCES station(ID) on delete cascade
  27. );


Message édité par andlio le 30-05-2005 à 10:31:47
mood
Publicité
Posté le 25-05-2005 à 13:58:05  profilanswer
 

n°1096574
gizmo
Posté le 25-05-2005 à 14:09:31  profilanswer
 

Si je ne me trompe, par défaut, les tables créées sont de type MyISAM, qui ne tient aucunement compte des FK.

n°1096583
andlio
Posté le 25-05-2005 à 14:12:12  profilanswer
 

gizmo a écrit :

Si je ne me trompe, par défaut, les tables créées sont de type MyISAM, qui ne tient aucunement compte des FK.


 
"MyISAM".... :heink: ???
 
tu as dis "par défaut", il y a un moyen de modifier ça ???

n°1096587
andlio
Posté le 25-05-2005 à 14:13:53  profilanswer
 

J'ai jeté un coup dans phpmyadmin, et voilà ce que j'ai :
 
Moteur de stockage :
-------------------  
MyISAM  
MERGE  
HEAP  
MEMORY  
BDB  
InnoDB  
ISAM  
 
celui qui a l'air sélectionné chez moi est "BDB"...


Message édité par andlio le 25-05-2005 à 14:16:25
n°1096598
gizmo
Posté le 25-05-2005 à 14:16:21  profilanswer
 

prend innoDB.

n°1096610
andlio
Posté le 25-05-2005 à 14:19:35  profilanswer
 

gizmo a écrit :

prend innoDB.


 
ok... et comment on fait ???
 
quand je clique dessus, j'ai simplement des infos :
 
InnoDB  
 
[ Variables | État InnoDB ]  
 
InnoDB est disponible sur ce serveur MySQL.  
 
  Répertoire des données        
  Fichiers de données              ibdata1:10M:autoextend    
  Taille de la mémoire-tampon   8 192 Ko    
 

n°1096637
andlio
Posté le 25-05-2005 à 14:27:37  profilanswer
 

bon voilà, j'ai essayé et j'ai tjr le meme problème :(
 
une idée ??

n°1096638
gizmo
Posté le 25-05-2005 à 14:28:49  profilanswer
 

tu est sûr qu'elles sont en innoDB?

n°1096649
andlio
Posté le 25-05-2005 à 14:31:11  profilanswer
 

pour chaque table, je suis allé dans 'Opérations' et j'ai sélectionné 'InnoDB' dans 'Type de table'... c'est bien comme ça qu'il faut faire non ?

n°1096657
drasche
Posté le 25-05-2005 à 14:33:14  profilanswer
 

andlio a écrit :

pour chaque table, je suis allé dans 'Opérations' et j'ai sélectionné 'InnoDB' dans 'Type de table'... c'est bien comme ça qu'il faut faire non ?


Oui mais même si le type n'était pas réellement disponible, il ne te renverrait pas d'erreur. Donc repasse dans la définition de ta table pour t'assurer qu'elle est bien en InnoDB ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
mood
Publicité
Posté le 25-05-2005 à 14:33:14  profilanswer
 

n°1097534
andlio
Posté le 26-05-2005 à 08:38:32  profilanswer
 

drasche a écrit :

Oui mais même si le type n'était pas réellement disponible, il ne te renverrait pas d'erreur. Donc repasse dans la définition de ta table pour t'assurer qu'elle est bien en InnoDB ;)


 
ca y est, je suis passé en InnoDB... mais ca change rien :(

n°1099617
andlio
Posté le 27-05-2005 à 14:51:11  profilanswer
 

Code :
  1. create table t1 (
  2.   idT1 int(2),
  3.   nom varchar(2),
  4.   primary key (id)
  5. ) type=InnoDB;
  6. create table t2 (
  7.   idT2 int(2),
  8.   idT1 int(2),
  9.   primary key (idT2),
  10.   foreign key (idT1) references t1 (idT1) on delete cascade
  11. ) type=InnoDB;


voilà ce que je lance comme requête, et voilà ce que MySQL me sort comme erreur :

#1005 - Can't create table './test/t2.frm' (errno: 150)


 
la table t1 est correctement créée. l'erreur vient de la ligne 11 (puisque quand je fais la mm requête en la supprimant ça marche correctement).
 
j'ai vraiment besoins d'aide là... je ne vois vraiment pas comment faire...

n°1099711
drasche
Posté le 27-05-2005 à 15:43:19  profilanswer
 

Il me semble qu'il te faut un index sur chaque champ déclaré comme clé étrangère.


Message édité par drasche le 27-05-2005 à 15:45:18

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°1099751
gizmo
Posté le 27-05-2005 à 16:01:05  profilanswer
 

c'est pas un index qu'il faut, c'est l'unicité [:kiki]

n°1099799
andlio
Posté le 27-05-2005 à 16:21:11  profilanswer
 

drasche a écrit :

Il me semble qu'il te faut un index sur chaque champ déclaré comme clé étrangère.


 
comment fait-ton pour définir un index avec MySQL ?
 

gizmo a écrit :

c'est pas un index qu'il faut, c'est l'unicité [:kiki]


 
 :??:

n°1099835
andlio
Posté le 27-05-2005 à 16:35:39  profilanswer
 

j'ai fais ça :
 

Code :
  1. CREATE TABLE `t1` (
  2. `ID1` INT( 2 ) NOT NULL ,
  3. `NOM` VARCHAR( 5 ) NOT NULL ,
  4. `PRENOM` VARCHAR( 5 ) NOT NULL ,
  5. PRIMARY KEY (ID1)
  6. ) TYPE = InnoDB;
  7. CREATE TABLE `t2` (
  8. `ID2` INT( 2 ) NOT NULL ,
  9. `NOM` VARCHAR( 5 ) NOT NULL ,
  10. `ID1` INT( 2 ) NOT NULL ,
  11. UNIQUE (
  12. `NOM`
  13. ),
  14. PRIMARY KEY (ID2),
  15. FOREIGN KEY (ID1) REFERENCES t1 (ID1) on delete cascade
  16. ) TYPE = InnoDB ;


ça marche maintenant  :D  
 
merci je commençais à devenir fou  :pt1cable:  :pt1cable:
 
au fait c'est bien ça ou c'est un coup de chance ???


Message édité par andlio le 27-05-2005 à 16:36:07
n°1099979
gizmo
Posté le 27-05-2005 à 19:00:49  profilanswer
 

c'est bon parce que les clef primaires sont uniques par definition.

n°1101395
andlio
Posté le 30-05-2005 à 10:08:12  profilanswer
 

il y a qd même un problème : pourquoi sommes-nous obligé de définir la clé étrangère comme étant unique !!??
 
dans mon cas, j'ai 2 tables : 'station' et 'OS'.
 
chaque station référencées dans la table 'station' possède un OS référencé dans la table 'OS'. Mais plusieurs stations peuvent avoir le même OS.
 
cependant, si on met la clé primaire en 'UNIQUE', c'est impossible !
 
comment faire alors ?


Message édité par andlio le 30-05-2005 à 10:16:27
n°1101398
andlio
Posté le 30-05-2005 à 10:30:43  profilanswer
 

C'est bon c'est résolu...
 
il falait simplement les définir en tant qu'index et non en tant qu'unique... comme vous me l'avez dit avant  :whistle:  
 
merci  :D

n°1146249
kmi_67
Posté le 11-07-2005 à 13:15:10  profilanswer
 

bonjour,
 
J'aimerais egalement utiliser lesclé etrangère ss mysql mais le pb c'et que je trouve pas le type innodb...
quelqu'un aurait il une idee?
 
merci bcp  
 

n°1147522
andlio
Posté le 12-07-2005 à 10:33:14  profilanswer
 

tu as quelle version de de mysql ?

n°1149833
kmi_67
Posté le 14-07-2005 à 11:42:18  profilanswer
 

en fait j'utilise mysql version 4.0.15

n°1152288
andlio
Posté le 18-07-2005 à 10:56:32  profilanswer
 

kmi_67 a écrit :

en fait j'utilise mysql version 4.0.15


 
"(...) Les tables InnoDB sont inclues dans la distribution source de MySQL depuis la version 3.23.34a (...)"
 
donc le pb ne vient pas de là  ;)  
 
http://www.manuelphp.com/mysql/innodb-overview.php
http://dev.mysql.com/doc/mysql/en/ [...] aints.html
 
essaye d'aller jeter un oeil sur ces sites, peut-être que ça t'apportera plus d'infos

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  clé étrangère avec MySQL [RESOLU]

 

Sujets relatifs
[Résolu]Variables non reconnues sous easy php[easyphp] Rendre accessible le serveur depuis un réseau local [résolu]
[RESOLU]Comment Streamer un fichier WMV ?Fusionner trois tables (résolu)
[résolu][PHP/JS] Formulaire avec input name="nom[]"[RESOLU][Javascript] Mise en page compliquée :)
[Resolu] Récupérer le mois à partir du numero de semaine[résolu] fonction (mail) - bizarrerie
Problème connexion Access->MySQLscript php de recherche (multicriteres) , et d'update de tables mysql
Plus de sujets relatifs à : clé étrangère avec MySQL [RESOLU]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR