it-swarm.com.de

Richtiges Erstellen von zusammengesetzten Primärschlüsseln - MYSQL

Hier ist eine grobe Vereinfachung eines intensiven Setups, mit dem ich arbeite. table_1 Und table_2 Haben beide automatisch inkrementierte Ersatzprimärschlüssel als ID. info ist eine Tabelle, die Informationen zu table_1 und table_2 enthält.

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

Ich versuche zu entscheiden, ob ich den Primärschlüssel von info aus den IDs von table_1 Und table_2 Zusammensetzen soll. Wenn ich das tun würde, was von diesen ist am sinnvollsten?
(in diesem Beispiel kombiniere ich ID 11209 mit ID 437)

INT(9) 11209437 (ich kann mir vorstellen, warum das so ist)
VARCHAR (10) 11209-437
DECIMAL (10,4) 11209.437

Oder etwas anderes?

Wäre dies in Ordnung, um dies als Primärschlüssel für eine MySQL-MyISAM-Datenbank zu verwenden?

161
filip

Ich würde einen zusammengesetzten (mehrspaltigen) Schlüssel verwenden.

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

Auf diese Weise können Sie t1ID und t2ID auch als Fremdschlüssel verwenden, die auf die entsprechenden Tabellen verweisen.

304
AlexCuse

Ich würde den Primärschlüssel der "info" -Tabelle nicht zu einer Kombination der beiden Werte aus anderen Tabellen machen.

Andere können die Gründe besser ausdrücken, aber es fühlt sich falsch an, eine Spalte zu haben, die wirklich aus zwei Informationen besteht. Was ist, wenn Sie aus irgendeinem Grund die ID aus der zweiten Tabelle sortieren möchten? Was ist, wenn Sie zählen möchten, wie oft ein Wert aus einer der Tabellen vorhanden ist?

Ich würde diese immer als zwei verschiedene Spalten behalten. Sie könnten einen zweispaltigen Primay-Schlüssel in mysql verwenden ... PRIMARY KEY (id_a, id_b) ... aber ich bevorzuge die Verwendung eines zweispaltigen eindeutigen Indexes und ein automatisch inkrementiertes Primärschlüsselfeld.

20
wmorse

die Syntax ist CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3) zum Beispiel ::

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

das obige Beispiel funktioniert, wenn Sie es schreiben, während Sie die Tabelle erstellen, zum Beispiel:

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

um diese Einschränkung zu einer vorhandenen Tabelle hinzuzufügen, müssen Sie die folgende Syntax befolgen

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

Angenommen, Sie haben bereits eine Tabelle erstellt. Mit dieser Abfrage können Sie einen zusammengesetzten Primärschlüssel erstellen

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

Zusammengesetzte Primärschlüssel sind das, was Sie möchten, um eine Viel-zu-Viel-Beziehung mit einer Faktentabelle zu erstellen. Beispielsweise könnten Sie ein Ferienmietpaket haben, das eine Reihe von Immobilien enthält. Auf der anderen Seite könnte die Immobilie auch als Teil einer Reihe von Mietpaketen für sich oder mit anderen Objekten verfügbar sein. In diesem Szenario stellen Sie die Beziehung zwischen der Eigenschaft und dem Mietpaket mit einer Eigenschafts-/Paketfaktentabelle her. Die Zuordnung zwischen einer Eigenschaft und einem Paket ist eindeutig. Sie verbinden immer nur property_id mit der Eigenschaftstabelle und/oder package_id mit der Pakettabelle. Jede Beziehung ist eindeutig und ein auto_increment-Schlüssel ist redundant, da er in keiner anderen Tabelle enthalten ist. Daher ist die Definition des zusammengesetzten Schlüssels die Antwort.

4
Adam Penny

Abgesehen von persönlichen Entwurfspräferenzen gibt es Fälle, in denen man zusammengesetzte Primärschlüssel verwenden möchte. Tabellen können zwei oder mehr Felder enthalten, die eine eindeutige Kombination bieten, und zwar nicht unbedingt über Fremdschlüssel.

Beispielsweise hat jeder US-Bundesstaat eine Reihe einzigartiger Kongressbezirke. Während viele Bundesstaaten individuell eine CD-5 haben, wird es in keinem der 50 Bundesstaaten mehr als eine CD-5 geben und umgekehrt. Daher wäre das Erstellen eines automatischen Nummernfelds für Massachusetts CD-5 überflüssig.

Wenn die Datenbank eine dynamische Webseite ausführt, ist das Schreiben von Code zur Abfrage einer Kombination aus zwei Feldern möglicherweise viel einfacher als das Extrahieren/erneute Übermitteln eines automatisch nummerierten Schlüssels.

Obwohl ich die ursprüngliche Frage nicht beantworte, schätze ich Adams direkte Antwort.

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 Ich wollte dies als Kommentar zu Ihrer Antwort hinzufügen, habe aber nach mehreren fehlgeschlagenen Versuchen, neue Zeilen in Kommentare einzufügen, aufgegeben.

Das heißt, t1ID ist in Tabelle_1 eindeutig, aber das macht es auch in der INFO-Tabelle nicht eindeutig.

Zum Beispiel:

Table_1 hat:
ID-Feld
1 A
2 B

Table_2 hat:
ID-Feld
1 X
2 Y

INFO kann dann haben:
t1ID t2ID Feld
1 1 einige
1 2 Daten
2 1 pro Person
2 2 Reihe

In der INFO-Tabelle benötigen Sie also sowohl t1ID als auch t2ID, um eine Zeile eindeutig zu identifizieren

1
sactiw