Kann ich mehrere Primärschlüssel in einer einzigen Tabelle haben?
Antworten
Zu viele Anzeigen?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.
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.
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.
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 |
+--------+----+---------+
(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
- See previous answers
- Weitere Antworten anzeigen