doublon qui surgit hors de la nuit :s

Eléphanteau du PHP | 23 Messages

01 févr. 2006, 10:09

Bonjour,

je m'explique de ce pas :

je gère un annuaire téléphonique et dans mon MCD j'ai 3 entité qui sont relié à une association (une ternaire quoi) !! j'en vien à mon probleme

voici la structure de mes tables :

Code : Tout sélectionner

CREATE TABLE `agent` ( `CODE_AGENT` int(5) NOT NULL auto_increment, `CODE_CIV` int(2) default '0', `NOM_AGENT` varchar(128) default NULL, `PRENOM_AGENT` varchar(128) default NULL, `TEL_AGENT` varchar(30) default NULL, `BIP_AGENT` int(5) default NULL, `MAIL_AGENT` varchar(128) default NULL, PRIMARY KEY (`CODE_AGENT`), KEY `I_FK_AGENT_CIVILITÉ` (`CODE_CIV`) ) TYPE=MyISAM AUTO_INCREMENT=223 CREATE TABLE `service` ( `CODE_SERVICE` int(4) NOT NULL auto_increment, `CODE_DEPARTEMENT` int(3) NOT NULL default '0', `LIB_SERVICE` varchar(128) NOT NULL default '', PRIMARY KEY (`CODE_SERVICE`), KEY `I_FK_SERVICE_DEPARTEMENT` (`CODE_DEPARTEMENT`) ) TYPE=MyISAM AUTO_INCREMENT=21 ; CREATE TABLE `sous_service` ( `CODE_SSERV` int(4) NOT NULL auto_increment, `LIB_SSERV` varchar(128) NOT NULL default '', PRIMARY KEY (`CODE_SSERV`) ) TYPE=MyISAM AUTO_INCREMENT=134 ; et la ternaire : CREATE TABLE `faire_partie` ( `CODE_SSERV` int(4) NOT NULL default '0', `CODE_SERVICE` int(4) NOT NULL default '0', `CODE_AGENT` int(5) NOT NULL default '0', `poste` varchar(200) NOT NULL default '', PRIMARY KEY (`CODE_AGENT`,`CODE_SSERV`), KEY `I_FK_FAIRE_PARTIE_AGENT` (`CODE_AGENT`), KEY `I_FK_FAIRE_PARTIE_SOUS_SERVICE` (`CODE_SSERV`), KEY `I_FK_FAIRE_PARTIE_SERVICE` (`CODE_SERVICE`) ) TYPE=MyISAM;
en quelque mot un agent peut faire partie d'un ou plusieur sous service qui lui meme peut faire partie de un ou plusieurs services donc mes infos de la table faire partie ressemble a :

Code : Tout sélectionner

INSERT INTO faire_partie values (1,1,1,'Directeur'); INSERT INTO faire_partie values (1,1,2,'Attachée d''administration'); INSERT INTO faire_partie values (1,2,2,'Attachée d''administration'); INSERT INTO faire_partie values (1,2,3,'Directeur Adjoint');
pour commenter le premier l'agent 1 fais parti du sous service numéro 1 appartenant au service numéro 1 et cette agent est directeur (jusque la pas de problème)

SAUF que fais incompréhensible si j'insère les 3 premier la il m'indique ce message d'erreur :

Code : Tout sélectionner

#1062 - Duplicata du champ '2-1' pour la clef 1
ce que je ne comprend manifestement pas car les clés primaires de la table faire_partie ne sont pas 3 fois les même !!

donc si quelqu'un savait ce qu'il se passe !!!

merci

cordialement

st0nky

Mammouth du PHP | 19672 Messages

01 févr. 2006, 10:29

Tu as dans cette table une clé primaire composite, donc chaque élémet de cette clé peut être résent à plusieurs exemplaires, mais la combinaison des deux doit être unique :

Ta clé est composée des champs `CODE_AGENT` + `CODE_SSERV` :
Or dans tes requêtes d'insertion, tu as les lignes 2 et 3 qui présentent la même combinaison de clés : "2" pour `CODE_AGENT` et "1" pour `CODE_SSERV` : la combinaison "2-1" étant déjà présente une fois lors de la seconde insertion, tu ne peux plus l'utiliser pour une nouvelles insertion, et c'est pourtant le cas avec la troisième insertion.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

01 févr. 2006, 12:49

la ou je t'arrête c'est qu'il y a 3 clés primaire composite :

code_agent + code_sserv + code_service (via la table faire_partie)

tu vois ??

donc étant donné cela, je continuer d'affirmer que je ne comprend pas !!! :s

Eléphanteau du PHP | 23 Messages

01 févr. 2006, 12:54

si je suis le résonnement que j'ai voulu entreprendre

un agent peut faire partie de la direction (sous service) de la direction générale

et peut aussi faire partie de la direction des service du personnel

ce qui justifie :

Code : Tout sélectionner

INSERT INTO faire_partie values (1,1,2,'Attachée d''administration'); INSERT INTO faire_partie values (1,2,2,'Attachée d''administration');
1,1,2 ==> agent 1 dans la direction de la direction général et a pour poste "attaché d'administration"

1,2,2 ==> agent 1 dans la direction mais cette fois dans le service du personnel en tant q"attaché d'administration" !!

je crois que je ne peut pas être plus claire quand au soucis du doublon que je ne comprend toujours pas !! :s:s

Mammouth du PHP | 19672 Messages

01 févr. 2006, 16:02

J'ai pourtant pas écrit ce code :

Code : Tout sélectionner

PRIMARY KEY (`CODE_AGENT`,`CODE_SSERV`)
Je n'y vois que deux champs composant ta clé primaire, pas trois.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

01 févr. 2006, 16:09

effectivement je viens de voir l'erreur !!!!

merci de l'aide

Mammouth du PHP | 19672 Messages

01 févr. 2006, 16:43

[Résolu] :?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: