477 Stimmen

Kann ich mehrere Primärschlüssel in einer einzigen Tabelle haben?

Kann ich mehrere Primärschlüssel in einer einzigen Tabelle haben?

680voto

Adam Pierce Punkte 32051

Eine Tabelle kann eine Zusammengesetzter Primärschlüssel der ein Primärschlüssel aus zwei oder mehr Spalten ist. Zum Beispiel:

CREATE TABLE userdata (
  userid INT,
  userdataid INT,
  info char(200),
  primary key (userid, userdataid)
);

Aktualisierung: Hier ist ein Link mit einer ausführlicheren Beschreibung von zusammengesetzten Primärschlüsseln.

233voto

RB. Punkte 35000

Sie können nur einen Primärschlüssel haben, aber Sie können mehrere Spalten in Ihrem Primärschlüssel haben.

Sie können auch Unique-Indizes auf Ihrer Tabelle haben, die ein bisschen wie ein Primärschlüssel funktionieren, indem sie eindeutige Werte erzwingen und die Abfrage dieser Werte beschleunigen.

52voto

Walter Mitty Punkte 17177

Eine Tabelle kann mehrere Kandidatenschlüssel haben. Jeder Kandidatenschlüssel ist eine Spalte oder eine Gruppe von Spalten, die zusammengenommen UNIQUE und ebenfalls NOT NULL sind. Die Angabe von Werten für alle Spalten eines Kandidatenschlüssels reicht also aus, um festzustellen, ob es eine Zeile gibt, die die Kriterien erfüllt, oder ob es überhaupt keine Zeilen gibt.

Kandidatenschlüssel sind ein grundlegendes Konzept im relationalen Datenmodell.

Wenn mehrere Schlüssel in einer Tabelle vorhanden sind, ist es üblich, einen der Kandidatenschlüssel als Primärschlüssel zu bestimmen. Es ist auch üblich, dass alle Fremdschlüssel zur Tabelle auf den Primärschlüssel verweisen und nicht auf einen anderen Kandidatenschlüssel.

Ich empfehle diese Praktiken, aber es gibt nichts im relationalen Modell, das die Auswahl eines Primärschlüssels unter den Kandidatenschlüsseln erfordert.

19voto

Eye Punkte 8506

Dies ist die Antwort sowohl auf die Hauptfrage als auch auf die Frage von @Kalmi nach

Welchen Sinn hätte es, mehrere automatisch generierte Spalten zu haben?

Dieser Code unten hat einen zusammengesetzten Primärschlüssel. Eine der Spalten wird automatisch erhöht. Dies funktioniert nur in MyISAM. InnoDB erzeugt einen Fehler " FEHLER 1075 (42000): Falsche Tabellendefinition; es kann nur eine Auto-Spalte geben und diese muss als Schlüssel definiert sein ".

DROP TABLE IF EXISTS `test`.`animals`;
CREATE TABLE  `test`.`animals` (
  `grp` char(30) NOT NULL,
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `name` char(30) NOT NULL,
  PRIMARY KEY (`grp`,`id`)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;

Which returns:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

16voto

(Ich habe mich eingehend damit beschäftigt.)

Schlüssel der Kandidaten - Eine minimale Spaltenkombination, die zur eindeutigen Identifizierung einer Tabellenzeile erforderlich ist.
Zusammengesetzte Tasten - 2 oder mehr Spalten.

  • Mehrere Schlüssel der Kandidaten in einer Tabelle existieren können.
    • Primärer SCHLÜSSEL - Nur einer der Kandidatenschlüssel, der ausgewählt durch uns
    • Alternative Tasten - Alle andere Kandidatenschlüssel
      • Sowohl Primär- als auch Sekundärschlüssel können sein Zusammengesetzte Tasten

Quellen:
https://en.wikipedia.org/wiki/Superkey
https://en.wikipedia.org/wiki/Candidate_key
https://en.wikipedia.org/wiki/Primary_key
https://en.wikipedia.org/wiki/Compound_key

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X