Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Outils
Outils Forum d'entraide sur les outils pour MySQL. Avant de poster -> Outils MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/08/2006, 16h17   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
Par défaut clé étrangère rétissante

Bonjour à tous,

j'ai créé deux table ( entreprise et contact) ou un contact correspond à un salarié de l'entreprise et je voudrai que lorsque je supprime une entreprise, tous les contacts liés à celle-ci soient supprimés également. Pour ce faire je veux lier les deux tables par une clé etrangère mais c'est la que ca coince. La clé étrangère relierait la raison sociale de l'entreprise avec un champ de la table contact CO_EN_raisonSociale.

Mon code est le suivant:

Citation:

DROP TABLE IF EXISTS `contacts`;
CREATE TABLE `contacts` (
`CO_identifiant` tinyint(4) NOT NULL auto_increment,
`CO_nom` varchar(255) NOT NULL default '',
`CO_prénom` varchar(255) default NULL,
`CO_fonction` varchar(255) default NULL,
`CO_email` varchar(255) default NULL,
`CO_telephoneFixe` varchar(20) default NULL,
`CO_telephonePortable` varchar(20) default NULL,
`CO_civilite` varchar(255) NOT NULL default '',
`CO_EN_raisonSociale` tinyint(4) NOT NULL default '',
INDEX par_ind (CO_EN_raisonSociale),
PRIMARY KEY (`CO_identifiant`),
FOREIGN KEY (CO_EN_raisonSociale) REFERENCES entreprise(EN_raisonSociale) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB ;

DROP TABLE IF EXISTS `entreprise`;
CREATE TABLE `entreprise` (
`EN_identifiant` tinyint(4) NOT NULL auto_increment,
`EN_raisonSociale` varchar(255) NOT NULL default '',
`EN_adresse` varchar(255) NOT NULL default '',
`EN_boitePostale` varchar(30) default NULL,
`EN_codePostal` varchar(10) NOT NULL default '',
`EN_telephone` varchar(20) default NULL,
`EN_web` varchar(255) default NULL,
`EN_numDebutAbo` varchar(20) NOT NULL default '',
`EN_numFinAbo` varchar(20) NOT NULL default '',
`EN_dateDebutAbo` date default NULL,
`EN_dateFinAbo` date default NULL,
`EN_ville` varchar(255) NOT NULL default '',
`EN_secteur` varchar(255) NOT NULL default '',
`EN_abonner` varchar(255) NOT NULL default '',
`EN_commentaire` varchar(255) default NULL,
PRIMARY KEY (`EN_raisonSociale`),
UNIQUE KEY `EN_identifiant` (`EN_identifiant`),
UNIQUE KEY `EN_raisonSociale` (`EN_raisonSociale`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

voila, j'ai déjà été sur plusieurs tutoriel et je pense faire ce qu'il faut mais je recoit toujours l'erreur #1005 - Ne peut cr饲 la table '.\clients\contacts.frm' (Errcode: 150)

Que faut il que je fasse. Est ce que j'ai oublié quelquechose?

d'avance merci

PS: je bosse avec phpMyAdmin SQL Dump version 2.6.1
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 16h28   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 450
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 450
Points : 7 553
Points : 7 553
Si tu exécutes ton script dans l'ordre indiqué, l'erreur peut se comprendre.
Tu fais référence lors de la création de la table contacts à la table entreprise qui n'est pas encore créée
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 16h38   #3
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
oki

je viens de modifier mon script mais j'ai toujours la même erreur.

as tu une autre idée?
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 17h00   #4
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
Bonjour,

Attention... à ce que tu fais !
Dans les clés étrangères il faut que le type du champ soit identique dans les deux tables, ce qui n'est pas le cas ici (dans ton script).

Code :
1
2
contacts.CO_EN_raisonSociale => tinyint(4)
entreprise.EN_raisonSociale => varchar(255)
Je pense que tu t'es trompé sur le champ de ta clé étrangère. C'était surement entreprise(EN_identifiant) que tu voulais mettre je pense (à la place de raison sociale).
__________________
La vitesse de la lumière étant supérieure à la vitesse du son, certaines personnes brillent encore tant qu'elles n'ont pas parlé
-----------------------------------------------------------
Retrouvez mes articles informatique sur mon Site Developpez.
Le reste, sur le Site perso !

DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 17h06   #5
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 450
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 450
Points : 7 553
Points : 7 553
Citation:
Envoyé par benoitinfrance
je viens de modifier mon script mais j'ai toujours la même erreur.
as tu une autre idée?
En effet, je n'avais pas été regarder assez loin.
Si tu regardes tes définitions :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 CREATE TABLE `contacts` (
...
  `CO_EN_raisonSociale` tinyint(4) NOT NULL DEFAULT '',
...
FOREIGN KEY (CO_EN_raisonSociale) 
  REFERENCES entreprise(EN_raisonSociale) 
  ON DELETE CASCADE ON UPDATE CASCADE
 );
 
CREATE TABLE `entreprise` (
  `EN_identifiant` tinyint(4) NOT NULL AUTO_INCREMENT,
  `EN_raisonSociale` varchar(255) NOT NULL DEFAULT '',
...
);
Tu ne peux pas faire référence à une colonne de type différent.
Il faudrait écrire :
Code :
1
2
3
FOREIGN KEY (CO_EN_raisonSociale)
  REFERENCES entreprise(EN_identifiant)
  ON DELETE CASCADE ON UPDATE CASCADE
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 17h16   #6
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
oki

je viens de faire la modification mais maintenant quand je lance mon script il me dit qu'il ne peut pas supprimer les enregistrements car ils sont liés avec une clé etrangère.

Je ne me souviens plus très bien. Pour supprimer les contraintes de clé primaire et de clé étrangère c'est:

ALTER TABLE contact DROP CONSTRAINT ALL;
DROP TABLE IF EXIST contact;


En fait je c'est que ce n'est pas ca car il me renvoi une erreur.

pourriez vous me guider?
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 17h22   #7
Membre éclairé
 
Avatar de DBProg
 
Étudiant
Inscription : juillet 2006
Messages : 242
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2006
Messages : 242
Points : 315
Points : 315
Il faut supprimer dans l'ordre inverse de la création. Donc supprimer contacts avant entreprise dans ton cas.

Sinon utiliser ceci pour forcer :

Code :
1
2
3
SET FOREIGN_KEY_CHECKS=0;
...
SET FOREIGN_KEY_CHECKS=1;
__________________
La vitesse de la lumière étant supérieure à la vitesse du son, certaines personnes brillent encore tant qu'elles n'ont pas parlé
-----------------------------------------------------------
Retrouvez mes articles informatique sur mon Site Developpez.
Le reste, sur le Site perso !

DBProg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 18h08   #8
Candidat au titre de Membre du Club
 
Inscription : novembre 2005
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 78
Points : 12
Points : 12
merci de votre aide...

ça fonctionne.
benoitinfrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h19.


 
 
 
 
Partenaires

Hébergement Web