Forum Clubic

Concaténation de deux clé primaire - POUR MySQL

Bonjour,

Je voudrais savoir comment on fait pour créer une table dont la clé primaire est la concaténation de deux autre clé venant d’autre table.

Dans mon cas c’est une table xxx avec pour clé primaire la concaténation de id_prod et id_fact qui se trouvent réspéctivement dans les tables produit et facture.

Merci

Bah faut le faire à la main ou créer une clef qui est l’association de 2 champs.

ça serait bien que tu cite ton SGBD/logiciel que tu utilises

C’est sous MySQL (cf: titre)
J’utilise EasyPHP

C’est juste un projet dans le cadre de mon BTS IG
Si non comment ça à la main?
J’arrive à représenter les clé étrangères (avec references), mais pour la concaténation je lute.

Merci de ta reponse rapide

Je sais pas si en mysql on peut faire un truc du genre:

SQL
[color=blue;font-weight:bold]INSERT[/color] INTO Table3 ( dest )

[color=blue;font-weight:bold]SELECT[/color] [Table1.a] & " " & [Table2.c] AS cle_primaire
FROM Table1, Table2;

Je suis pas un pro de mysql

tu peux très bien faire une clef sur 2 colonnes, c’est toujours comme ça qu’on fait, et c’est ce qu’il faut pour écrire les jointures (pour trouver tous les"prod" liés à “fact” et les “fact” liés à prod), c’est une table d’association, et ça signifie que tu as une liaison n-n entre les tables. :wink:
exemple: (vérifie la syntaxe des constaints et ajoute des index sur tes colonnes)

SQL
CREATE TABLE prod_fact

(
id_prod VARCHAR2(100 BYTE) NOT NULL,
id_fact VARCHAR2(100 BYTE) NOT NULL
)
[color=blue;font-weight:bold]ALTER TABLE[/color] prod_fact ADD (
CONSTRAINT pk_prod_fact PRIMARY KEY (id_prod,id_fact)

)

:slight_smile:

Ok donc dans mon cas c’est


CREATE TABLE concerner // nom de ma liaison dans le MCD
(
id_prod int,
id_fact int,
qt int
);
ALTER TABLE concerner ADD (
CONTRAINT prod_fact PRIMARY KEY (id_prod.id_fact)
);

et cela respecte mes models conceptuel et logique de données
et sa ne donne ça dans ma table ??:

-prod_fact en clé primaire
-id_prod
-id_fact
-qt

c’est bien ça???

sa me met une erreur quand j’essaie sa. (en ajoutant bien sure les virgule et point virgule que j’ai oublié.

La premiere requette passe, jusqu’à la normal.

Et j’ai l’erreur suivante en executant la seconde:

ALTER TABLE concerner ADD (
CONSTAINT prod_fact PRIMARY KEY ( id_prod.id_fact )
);
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘prod_fact PRIMARY KEY (id_prod.id_fact)
)’ at line 2

J’ai jamais trop joué avec les contraintes, note que tu peux parfaitement utiliser ta table sans ajouter les contraintes, mais que tu prend un risque par rapport à la cohérence des données: tu peux apparament aussi utiliser un “Unique index”:

SQL
CREATE UNIQUE INDEX idx_prod_fact

ON prod_fact (id_prod, id_fact);

note: c’est bien une virgule entre id_prod et id_fact! j’ai l’impression que tu as mis un point. :slight_smile: typ eux mettre autant de colonne que tu veux en clef primaire.

Je ne suis pas sur d’avoir bien compris ce que tu disais: tu vas avoir 3 tables: prod, fact et fact_pord avec comme clef respective id_prod, id_fact et le couple (id_prod, idfact).