it-swarm.com.de

ALTER TABLE, um einen zusammengesetzten Primärschlüssel hinzuzufügen

Ich habe eine Tabelle namens provider. Ich habe drei Spalten mit den Namen person, place, thing. Es kann doppelte Personen, doppelte Orte und doppelte Dinge geben, aber es kann niemals eine doppelte Person-Ort-Ding-Kombination geben.

Wie würde ich ALTER TABLE verwenden, um einen zusammengesetzten Primärschlüssel für diese Tabelle in MySQL mit diesen drei Spalten hinzuzufügen?

181
David542
ALTER TABLE provider ADD PRIMARY KEY(person,place,thing);

Wenn bereits ein Primärschlüssel vorhanden ist, möchten Sie dies tun

ALTER TABLE provider DROP PRIMARY KEY, ADD PRIMARY KEY(person, place, thing);
398
Adrian Cornish

@ Adrian Cornishs Antwort ist richtig. Es gibt jedoch eine weitere Einschränkung beim Löschen eines vorhandenen Primärschlüssels. Wenn dieser Primärschlüssel von einer anderen Tabelle als Fremdschlüssel verwendet wird, wird beim Versuch, ihn zu löschen, eine Fehlermeldung angezeigt. In einigen Versionen von mysql war die dortige Fehlermeldung fehlerhaft (ab 5.5.17 ist diese Fehlermeldung immer noch vorhanden)

alter table parent  drop column id;
ERROR 1025 (HY000): Error on rename of
'./test/#sql-a04_b' to './test/parent' (errno: 150).

Wenn Sie einen Primärschlüssel löschen möchten, auf den eine andere Tabelle verweist, müssen Sie zuerst den Fremdschlüssel in dieser anderen Tabelle löschen. Sie können diesen Fremdschlüssel neu erstellen, wenn Sie ihn nach dem erneuten Erstellen des Primärschlüssels weiterhin benötigen.

Auch bei der Verwendung von zusammengesetzten Schlüsseln ist die Reihenfolge wichtig. Diese

1) ALTER TABLE provider ADD PRIMARY KEY(person,place,thing);
and
2) ALTER TABLE provider ADD PRIMARY KEY(person,thing,place);

sind nicht dasselbe. Beide erzwingen die Eindeutigkeit dieser Gruppe von drei Feldern, jedoch gibt es vom Standpunkt der Indizierung einen Unterschied. Die Felder werden von links nach rechts indiziert. Betrachten Sie beispielsweise die folgenden Abfragen:

A) SELECT person, place, thing FROM provider WHERE person = 'foo' AND thing = 'bar';
B) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz';
C) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz' AND thing = 'bar';
D) SELECT person, place, thing FROM provider WHERE place = 'baz' AND thing = 'bar';

B kann den Primärschlüsselindex in ALTER-Anweisung 1 verwenden
A kann den Primärschlüsselindex in ALTER-Anweisung 2 verwenden
C kann jeden Index verwenden
D kann keinen der Indizes verwenden

A verwendet die ersten beiden Felder in Index 2 als Teilindex. A kann Index 1 nicht verwenden, da es den Zwischenplatz-Teil des Index nicht kennt. Es ist jedoch möglicherweise weiterhin möglich, einen Teilindex für eine einzelne Person zu verwenden.

D kann keinen der Indizes verwenden, da er keine Person kennt.

Weitere Informationen finden Sie in den mysql-Dokumenten hier .

19
cs_alumnus

Vielleicht möchten Sie einfach eine EINZIGARTIGE BESCHRÄNKUNG. Vor allem, wenn Sie bereits einen Ersatzschlüssel haben. (Ein Beispiel für einen bereits vorhandenen Ersatzschlüssel wäre eine einzelne Spalte mit der Bezeichnung AUTO_INCREMENT.)

Unten finden Sie den SQL-Code für eine eindeutige Einschränkung

ALTER TABLE `MyDatabase`.`Provider`
    ADD CONSTRAINT CK_Per_Place_Thing_Unique UNIQUE (person,place,thing)
;
15
granadaCoder
alter table table_name add primary key (col_name1, col_name2);

Es ist definitiv besser, COMPOSITE UNIQUE KEY zu verwenden, wie @GranadaCoder es anbietet, ein etwas kniffliges Beispiel:

ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);

1
Arthur Kushman

ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

0
Lucky