web-dev-qa-db-fra.com

Comment créer correctement des clés primaires composites - MYSQL

Voici une simplification excessive d'un montage intense avec lequel je travaille. table_1 et table_2 ont tous les deux des clés primaires de substitution à incrémentation automatique comme identifiant. info est une table contenant des informations sur table_1 et table_2.

table_1 (id, field)  
table_2 (id, field, field)
info ( ???, field)

J'essaye de décider si je devrais faire la clé primaire de info un composé des identifiants de table_1 et de table_2. Si je devais faire cela, laquelle de ces choses a le plus de sens?
(dans cet exemple, je combine l'ID 11209 avec l'ID 437)

INT(9) 11209437 ((je peux imaginer pourquoi c'est mauvais)
VARCHAR (10) 11209-437
DECIMAL (10,4) 11209.437

Ou autre chose?

Est-ce que ce serait bien d'utiliser ceci comme clé primaire sur une base de données MYSQL MYISAM?

161
filip

Je voudrais utiliser une clé composite (multi-colonne).

CREATE TABLE INFO (
    t1ID INT,
    t2ID INT,
    PRIMARY KEY (t1ID, t2ID)
) 

De cette façon, vous pouvez avoir t1ID et t2ID comme clés étrangères pointant également vers leurs tables respectives.

304
AlexCuse

Je ne voudrais pas que la clé primaire de la table "info" soit un composite des deux valeurs d'autres tables.

D'autres peuvent mieux articuler les raisons, mais il est inacceptable que la colonne soit réellement composée de deux informations. Que faire si vous souhaitez trier l'ID de la deuxième table pour une raison quelconque? Que faire si vous voulez compter le nombre de fois qu'une valeur de l'une ou l'autre table est présente?

Je garderais toujours ces deux colonnes distinctes. Vous pouvez utiliser une clé primay à deux colonnes dans mysql ... PRIMARY KEY (id_a, id_b) ... mais je préfère utiliser un index unique à deux colonnes et disposer d'un champ de clé primaire auto-incrémenté.

20
wmorse

la syntaxe est CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3) par exemple ::

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

l'exemple ci-dessus fonctionnera si vous l'écrivez pendant que vous créez la table, par exemple:

CREATE TABLE person (
   P_Id int ,
   ............,
   ............,
   CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
);

pour ajouter cette contrainte à une table existante, vous devez suivre la syntaxe suivante

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (P_Id,LastName)
14
Ritabrata Gautam

Supposons que vous ayez déjà créé une table et que vous puissiez utiliser cette requête pour créer une clé primaire composite.

alter table employee add primary key(emp_id,emp_name);
6
Usman Yaqoob

Les clés primaires composites vous permettent de créer une relation plusieurs en plusieurs avec une table de faits. Par exemple, vous pourriez avoir un forfait de location de vacances qui comprend un certain nombre de propriétés. D'autre part, la propriété pourrait également être disponible dans le cadre d'un certain nombre de forfaits de location, soit seule, soit avec d'autres propriétés. Dans ce scénario, vous établissez la relation entre la propriété et le package de location avec une table de faits de propriété/package. L'association entre une propriété et un package sera unique, vous ne rejoindrez jamais uniquement en utilisant property_id avec la table property et/ou package_id avec la table package. Chaque relation est unique et une clé auto_increment est redondante car elle ne figurera dans aucune autre table. Par conséquent, définir la clé composite est la réponse.

4
Adam Penny

Outre les préférences de conception personnelles, il existe des cas où l'on souhaite utiliser des clés primaires composites. Les tables peuvent avoir deux champs ou plus qui fournissent une combinaison unique, et pas nécessairement au moyen de clés étrangères.

À titre d'exemple, chaque État américain dispose d'un ensemble de districts uniques du Congrès. Bien que de nombreux États puissent posséder individuellement un CD-5, il n’y aura jamais plus d’un CD-5 dans l’un des 50 États, et inversement. Par conséquent, la création d'un champ de numérotation automatique pour Massachusetts CD-5 serait redondante.

Si la base de données gère une page Web dynamique, l'écriture de code à interroger sur une combinaison de deux champs pourrait être beaucoup plus simple que l'extraction/la resoumission d'une clé numérotée automatiquement.

Donc, même si je ne réponds pas à la question initiale, j'apprécie certainement la réponse directe d'Adam.

3
KiloVoltaire
CREATE  TABLE `mom`.`sec_subsection` (

  `idsec_sub` INT(11) NOT NULL ,

  `idSubSections` INT(11) NOT NULL ,

  PRIMARY KEY (`idsec_sub`, `idSubSections`) 

);
1
Master Mind

@AlexCuse Je voulais ajouter ceci en tant que commentaire à votre réponse, mais j'ai abandonné après plusieurs tentatives infructueuses pour ajouter des nouvelles lignes dans les commentaires.

Cela dit, t1ID est unique dans table_1 mais ne le rend pas non plus unique dans la table INFO.

Par exemple:

Table_1 a:
Champ d'identification
1 A
2 B

Table_2 a:
Champ d'identification
1 FOIS
2 ans

INFO alors peut avoir:
t1ID champ t2ID
1 1 un peu
1 2 données
2 1 po chacun
2 2 rangée

Donc, dans la table INFO pour identifier de manière unique une ligne, vous avez besoin à la fois de t1ID et de t2ID.

1
sactiw