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
guignol 95 - 18 févr. 2011 à 18:02
A voir également:
- Engine=innodb default charset=latin1
- Chat engine - Télécharger - Outils Internet
- A d3d11-compatible gpu (feature level 11.0 shader model 5.0) is required to run the engine - Forum Jeux PC
- Mysql error in file: /engine/classes/mysql.php at line 53 ✓ - Forum Réseaux sociaux
- Borland database engine download - Télécharger - Édition & Programmation
- Default boot device missing or boot failed - Forum Matériel & Système
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
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
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?
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?
Sinon il existe un logiciel d'interface graphique pour cela :
c'est mysql workbench
https://www.mysql.com/products/workbench/
c'est mysql workbench
https://www.mysql.com/products/workbench/
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 ;)
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 ;)
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
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 :-))))
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 :-))))
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
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)
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)
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 ++
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 ++
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
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
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
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
27 juin 2008 à 09:35
Et je rajoute par la même occasion que j'ai bien vérifié les types de mes champs.
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
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!
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!
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
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 ????
#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 ????
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
27 juin 2008 à 11:12
HELP HELP HELP