Abygae
15 mai 2009 à 13:37
Tiens je suis etonné par ton affirmation Pollux.
Tu as bien raison sur le fait qu'une table n'a qu'une seule clé primaire.
Cependant, et tu le dis subtilement, une clé primaire peut être composé de plusieurs champs (Clé, composée de deux champs, symbolisée par (pk) dans l'exemple au dessus^^).
Donc, non sans erreur, il est habituel de penser à plusieurs clés primaires pour une table.
C'est une bonne precision de ta part, cependant pour les neophytes comme moi ce n'est pas inconcevable de penser de cette manière. Ce qui est souligner pour corriger cet conception de la clé primaire.
Amicalement
Pour repondre à la question initiale, il est donc possible d'avoir une clé primaire champ1(PK) d'une table A pointant sur la clé primaire champ1(pk) d'une table B. C'est d'ailleurs de cette maniere que l'on pourrait trouver les tables representant une généralisation en UML (pour le reverse engineering) meme si on a tendance a les regrouper en une seule table. Par contre je ne pourrais pas te dire quelle sera la reaction lors de l'enregistrement sur la table A, car un enregistrement ayant la meme clé primaire devrait aussi se trouver dans la table B. Faudrait il penser aux trigger pour lever ce problème ?
Je pense que tu confonds contrainte d'unicité et clé primaire. Une clé primaire peut avoir plusieurs formes (numérique, alphanumérique ou toute autre représentation) mais reste un champ unique, déclaré PK, ne pouvant contenir de doublons.
On peut mettre une contrainte empêchant de contenir des doublons dans un champs sans pourtant autant être un champ clé primaire. Cette contrainte est implicite dans un champ déclaré clé primaire. Ce sont 2 choses bien différentes.
il est donc possible d'avoir une clé primaire champ1(PK) d'une table A pointant sur la clé primaire champ1(pk) d'une table B. ... c'est malheureusement faux. Une relation entre deux tables se fait via une clé dite étrangère.
;o)
`vin` int(11) NOT NULL,
`numrep` int(11) NOT NULL,
KEY `vin` (`vin`),
KEY `numrep` (`numrep`),
CONSTRAINT `fk_vin` FOREIGN KEY (`vin`) REFERENCES `vehicule` (`vin`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_numrep` FOREIGN KEY (`numrep`) REFERENCES `reparation` (`numrep`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1" quant j'exécute sa me dit "#1005 - Can't create table 'gestion_auto.subir' (errno: 150)".aidez s'il vous plait.