Gestions des relations InnoDB MySQL

Fermé
lauraM Messages postés 17 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 4 mai 2009 - 26 juin 2008 à 16:41
 guignol 95 - 18 févr. 2011 à 18:02
Bonjour,
Bon je suis perdue et je souhaiterais que l'on m'aide à éclaircir quelques points.
Voilà j'ai donc une base données avec des tables. Mon but est de relier une clé étrangère à sa clé primaire.
J'ai fait des recherches et j'ai compris qu'il fallait mettre mon moteur de table en InnoDB.
Ensuite le point sur lequel je suis perdue c'est la gestion des relations ce qui je pense me permettrait d'atteindre mon précédemment définit.
Que dois-je utiliser pour que quand je supprime un enregistrement la clé étrangères soit de valeur null?
Actuellement quand j'essai de la faire j'ai une erreur comme moi je n'est pas de clé définit.
Bref j'y comprend rien du tout.
Pouvez-vous m'aider svp ????

10 réponses

Exemple : Vous avez fais un système de tutoriel. Il y a une table 'membres' avec une clé primaire 'id' et une table 'tutos' avec une clé étrangère 'id_membre'. Vous voudriez que lorsque le membre se désinscrit, le champ 'id_membre' devienne NULL.
Commencez par changer le moteur de BDD en mettant InnoBD (en bas de la page structure). Puis choisissez 'id' comme clé primaire et 'id_membre' comme externe (les boutons à droites dans le tableau structure).
Puis modifiez les deux champs et cochez la case NULL et revenez à la page structure de la table tutos. Cliquez sur le lien 'Gestion des relations'. Après 'id_membre' sélectionnez 'membres.id' et après 'ON DELETE' sélectionnez 'SET NULL'.
Validez le tout et testez : lorsque vous supprimé un membre tous ses tutos ont un 'id_membre' valent NULL !

PS : Tout ça c'est avec PHPMyAdmin
5
MySQL n'a pas d'interface graphique en tant que tel, c'est de la ligne de commande. Tu utilises quoi comme client graphique? phpMyAdmin? MySQLAdministrator?

J'avoue pour ma part ne jamais utiliser les clients graphiques pour la création des tables justement parce que c'est le bordel avec les clés, les index, les contraintes, etc... Donc je risque de ne pas trop pouvoir t'aider là dessus... ^^

Pour ton erreur, mysql te renvoi quoi comme phrase et/ou numéro d'erreur?
3
Sinon il existe un logiciel d'interface graphique pour cela :

c'est mysql workbench

https://www.mysql.com/products/workbench/
0
Voilà un exemple de tables faisant une référence:


DROP TABLE IF EXISTS `maTable`;
CREATE TABLE `maTable` (
`Nom` varchar(45) NOT NULL,
`Prenom` varchar(45) NOT NULL,
PRIMARY KEY (`Nom`,`Prenom`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



DROP TABLE IF EXISTS `monAutreTable`;
CREATE TABLE `monAutreTable` (
`Nom` varchar(45) NOT NULL,
`Prenom` varchar(45) NOT NULL,
`Adresse` varchar(150) default NULL,
PRIMARY KEY (`Nom`,`Prenom`),
FOREIGN KEY (`Nom`, `Prenom`) REFERENCES `maTable` (`Nom`, `Prenom`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


Voilà. C'est un exemple. Pour mettre la valeur à NULL. Il faut que tu rajoutes la clause "ON DELETE SET NULL" (il me semble que c'est ça ou en tous cas ça s'en rapproche) à ta contrainte de clef étrangère. En gros, écrire ça:

FOREIGN KEY (`Nom`, `Prenom`) REFERENCES `maTable` (`Nom`, `Prenom`) ON DELETE SET NULL


Voilà, j'espère que ça pourra t'aider ;)
2
lauraM Messages postés 17 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 4 mai 2009 1
26 juin 2008 à 17:54
Bonjour,
merci de ton aide précieuse.
Moi j'ai mis mes tables en InnoDB à la main dans mysql c'est-à-dire que il y a un onglet opérations quand je suis sur ma table, je vais dessus et je change le moteur de la table.
Donc pour ce point là c'est ok.
Ensuite j'ai essayé de faire comme tu m'as dit :

alter table intervention
add constraint fk_intervention_demandeclient foreign key (`IdDemande`)
references demandeclient(`IdDemande`)

Et malheureusement mysql en veut pas et je ne sais pas pourquoi.
Quand tu es dans l'onglet 'structure' de ta table tu as en dessous de tout tes champs un lien qui s'appelle "gestion des relations" et dedans il propose même de mettre une relation à la clé.
Est-ce que c'est ca qu'il faut que je fasse et si oui pouvez-vous m'expliquer.
MERCI :-))))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lauraM Messages postés 17 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 4 mai 2009 1
26 juin 2008 à 18:08
Alors déjà j'utilise phpadmin mais je peux tout codé dessus pour ca il n'y a pas de souci.

Quand je tape la requête moi même l'erreur est :

#1005 - Ne peut créer la table '.\ficheintervention\#sql-40c_15f.frm' (Errcode: 150)

Et quand je le fais avec les options de php admin cela donne :

Cannot add or update a child row: a foreign key constraint fails...

Voilà en fait j'ai vu un POSt où la personne avait le même problème que moi mais il n'a pas été résolu.
Voici le lien :

http://www.commentcamarche.net/forum/affich 4016692 les cles etrangeres avec mysql?Acces=1

Votre aide à tous est hyper importante. (projet de stage)
0
foutue erreur 1005, moi aussi je me prend la tête avec dans un autre topic. Vive les stages -__-

Bon, pour le coup, t'as pas l'air d'avoir le même cas que moi donc je peux ptet t'aider...

Tu peux mettre le script de création de tes deux tables où tu cherches à faire la jointure?

Si IdDemande n'est pas clé primaire de la table intervention (seulement secondaire quoi) il faut que tu rajoutes un Index dans la table intervention sur le champs idDemande.

Sinon vérifie bien que le types des champs sur lesquels tu veux mettre la contrainte de clé étrangère sont bien les même dans les deux tables (que tu n'ai pas un INT d'un coté et un UNSIGNED INT de l'autre par exemple).

C'est tout ce que je peux te dire pour le moment. D'autant plus que je suis loin d'être expert puisque j'ai moi même un problème similaire et j'attends une réponse sur un autre topic ^^ Et désolé, je ne pense pas que je pourrais répondre avant demain maintenant.

Bonne soirée et bon courage ++
0
lauraM Messages postés 17 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 4 mai 2009 1
27 juin 2008 à 09:34
Bonjour,
merci pour tes conseils.
Désolé je viens de relire le POST que j'ai mis en lien précédemment et j'annule ce que j'ai dis je ne pas sont problème mais une erreur du genre.
En fait j'ai bien mes clefs secondaire d'indexé, j'ai pu le faire avec une requête mais lorsque je veux rajouter on delete set null ou on update set null c'est là que ca coince et que mysql me lance une erreur comme quoi je ne peux pas faire ca car aucunes clés n'est définit.
Qu'est ce qu'il appel définit?
Moi ce que je pensait c'est qu'il fallait d'abord dire au clé primaire si elle agiissait en cascade, no action ou autres et ensuite faire la même chose pour les clés secondaires.
Qu'en pensez vous???
MERCI
0
lauraM Messages postés 17 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 4 mai 2009 1
27 juin 2008 à 09:35
Et je rajoute par la même occasion que j'ai bien vérifié les types de mes champs.
0
lauraM Messages postés 17 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 4 mai 2009 1
27 juin 2008 à 09:56
Bonjour,
De plus quand je veux créer la clé primaire c'est-à-dire sans lui definir les relation j'ai une erreur telle que :

requête SQL:

ALTER TABLE intervention ADD CONSTRAINT fk_intervention_demandeclient FOREIGN KEY ( `IdDemande` ) REFERENCES demandeclient( `IdDemande` )

MySQL a répondu:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`ficheinterv/#sql-d50_42`, CONSTRAINT `fk_intervention_demandeclient` FOREIGN KEY (`IdDemande`) REFERENCES `demandeclient` (`IdDemande`))

Ca m'énerve lol!
0
lauraM Messages postés 17 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 4 mai 2009 1
27 juin 2008 à 10:12
Mon gros souci c'est l'erreur précédente :

#1452 - Cannot add or update a child row: a foreign key constraint fails (`ficheinterv/#sql-d50_42`, CONSTRAINT `fk_intervention_demandeclient` FOREIGN KEY (`IdDemande`) REFERENCES `demandeclient` (`IdDemande`))

Je ne sais pas pourquoi pouvez-vous m'aider svp ????
-1
lauraM Messages postés 17 Date d'inscription jeudi 26 juin 2008 Statut Membre Dernière intervention 4 mai 2009 1
27 juin 2008 à 11:12
HELP HELP HELP
-3