wake-up-neo.com

Mehrspalten-Primärschlüssel in MySQL 5

Ich versuche zu lernen, wie man Schlüssel verwendet und die Gewohnheit bricht, SERIAL Typ-IDs für alle Zeilen in allen meinen Tabellen zu haben. Zur gleichen Zeit mache ich auch viele-zu-viele-Beziehungen und brauche daher eindeutige Werte für jede Spalte der Tabellen, die die Beziehungen koordinieren, was dies behindern würde.

Wie kann ich einen Primärschlüssel in einer Tabelle definieren, sodass ein beliebiger Wert in jeder Spalte wiederholt werden kann, solange die Kombination der Werte über alle Spalten hinweg nie genau wiederholt wird?

20
Kaji

Zitiert von der CREATE TABLE-Syntax Seite:

Ein PRIMARY KEY kann eine mehrspaltige .__ sein. Index. Sie können jedoch keine .__ erstellen. mehrspaltiger Index mit PRIMARY KEY-Schlüsselattribut in einer Spalte Spezifikation. Dabei werden nur Markierungen diese einzelne Spalte als primäre. Sie muss ein separates PRIMARY .__ verwenden. KEY-Klausel (index_col_name, ...).

So etwas kann für mehrspaltige Primärschlüssel verwendet werden:

CREATE TABLE
    product (
        category INT NOT NULL,
        id INT NOT NULL,
        price DECIMAL,
        PRIMARY KEY(category, id)
    );

From 13.6.4.4. Fremde Schlüsselbeschränkungen

44
Adriaan Stander

Primärschlüssel ist ein Domänenkonzept, das Ihre Entität eindeutig (notwendigerweise und ausreichend) unter ähnlichen Entitäten identifiziert. Ein zusammengesetzter (mehrspaltiger) Primärschlüssel ist nur dann sinnvoll, wenn ein Teil des Schlüssels auf eine bestimmte Instanz einer anderen Domäneneinheit verweist.

Nehmen wir an, Sie haben eine persönliche Sammlung von Büchern. Solange Sie alleine sind, können Sie sie zählen und jedem eine Nummer zuweisen. Die Nummer ist der Primärschlüssel der Domäne Ihrer Bibliothek.

Jetzt möchten Sie Ihre Bibliothek mit der Ihres Nachbarn zusammenführen, aber dennoch unterscheiden können, wem ein Buch gehört. Die Domäne ist jetzt breiter und der Primärschlüssel ist jetzt (owner, book_id).

Daher sollte die Erstellung jedes Primärschlüssel-Verbunds nicht Ihre Strategie sein, sondern sollte bei Bedarf verwendet werden.

Nun einige Fakten zu MySQL. Wenn Sie einen zusammengesetzten Primärschlüssel definieren und möchten, dass der RDBSM die IDs für Sie automatisch inkrementiert, sollten Sie den Unterschied zwischen dem Verhalten von MyISAM und InnoDB kennen.

Nehmen wir an, wir wollen eine Tabelle mit zwei Feldern: parent_id, child_id. Und wir möchten, dass die child_id automatisch inkrementiert wird.

MyISAM wird in Datensätzen mit der gleichen parent_id und in InnoDB automatisch in der gesamten Tabelle automatisch inkrementiert.

In MyISAM sollten Sie den Primärschlüssel als (parent_id, child_id) und in InnoDB als (child_id, parent_id) definieren, da das autoincrementierte Feld in dem Primärschlüssel in InnoDB ganz links stehen sollte.

18
newtover

Der Primärschlüssel ist ein eindeutiger Wert für die Zeile. Es macht keinen Sinn, den Preis anzugeben, einen Wert, der sich ändern könnte. Stellen Sie sich vor, Sie müssten einen großen Preisbereich ändern, dann würden sich alle diese Primärschlüsselwerte ändern. Was für ein Chaos wäre das!

0
Perry