clé étrangère avec MySQL [RESOLU]

clé étrangère avec MySQL [RESOLU] - SQL/NoSQL - Programmation

Marsh Posté le 25-05-2005 à 13:58:05    

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
Reply

Marsh Posté le 25-05-2005 à 13:58:05   

Reply

Marsh Posté le 25-05-2005 à 14:09:31    

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

Reply

Marsh Posté le 25-05-2005 à 14:12:12    

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 ???

Reply

Marsh Posté le 25-05-2005 à 14:13:53    

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
Reply

Marsh Posté le 25-05-2005 à 14:16:21    

prend innoDB.

Reply

Marsh Posté le 25-05-2005 à 14:19:35    

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    
 

Reply

Marsh Posté le 25-05-2005 à 14:27:37    

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

Reply

Marsh Posté le 25-05-2005 à 14:28:49    

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

Reply

Marsh Posté le 25-05-2005 à 14:31:11    

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 ?

Reply

Marsh Posté le 25-05-2005 à 14:33:14    

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)
Reply

Marsh Posté le 25-05-2005 à 14:33:14   

Reply

Marsh Posté le 26-05-2005 à 08:38:32    

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 :(

Reply

Marsh Posté le 27-05-2005 à 14:51:11    

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...

Reply

Marsh Posté le 27-05-2005 à 15:43:19    

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)
Reply

Marsh Posté le 27-05-2005 à 16:01:05    

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

Reply

Marsh Posté le 27-05-2005 à 16:21:11    

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]


 
 :??:

Reply

Marsh Posté le 27-05-2005 à 16:35:39    

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
Reply

Marsh Posté le 27-05-2005 à 19:00:49    

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

Reply

Marsh Posté le 30-05-2005 à 10:08:12    

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
Reply

Marsh Posté le 30-05-2005 à 10:30:43    

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

Reply

Marsh Posté le 11-07-2005 à 13:15:10    

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  
 

Reply

Marsh Posté le 12-07-2005 à 10:33:14    

tu as quelle version de de mysql ?

Reply

Marsh Posté le 14-07-2005 à 11:42:18    

en fait j'utilise mysql version 4.0.15

Reply

Marsh Posté le 18-07-2005 à 10:56:32    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed