Mam stolik o nazwie provider
. Mam trzy kolumny zwane person
, place
, thing
. Mogą istnieć zduplikowane osoby, zduplikowane miejsca i zduplikowane rzeczy, ale nigdy nie może istnieć zduplikowana kombinacja osoba-miejsce-rzecz.
Jak mam ZMIENIĆ TABELĘ, aby dodać złożony klucz podstawowy dla tej tabeli w MySQL z tymi trzema kolumnami?
Odpowiedź Adriana Cornisha jest poprawna. Istnieje jednak inne zastrzeżenie dotyczące upuszczania istniejącego klucza podstawowego. Jeśli ten klucz podstawowy jest używany jako klucz obcy w innej tabeli, podczas próby jego upuszczenia wystąpi błąd. W niektórych wersjach mysql komunikat o błędzie był zniekształcony (od 5.5.17 ten komunikat o błędzie jest nadal wyświetlany)
Jeśli chcesz upuścić klucz podstawowy, do którego odwołuje się inna tabela, najpierw musisz upuścić klucz obcy w tej drugiej tabeli. Możesz odtworzyć ten klucz obcy, jeśli nadal chcesz go po odtworzeniu klucza podstawowego.
Również w przypadku korzystania z kluczy kompozytowych ważna jest kolejność. Te
to nie to samo. Oba wymuszają unikalność na tym zestawie trzech pól, jednak z punktu widzenia indeksowania istnieje różnica. Pola są indeksowane od lewej do prawej. Rozważ na przykład następujące zapytania:
B może używać indeksu klucza podstawowego w instrukcji ALTER 1
A może używać indeksu klucza podstawowego w instrukcji ALTER 2
C może używać dowolnego indeksu
D nie może używać żadnego indeksu
A wykorzystuje dwa pierwsze pola w indeksie 2 jako indeks częściowy. Nie można użyć indeksu 1, ponieważ nie zna części indeksu dotyczącej pośredniego miejsca. Jednak nadal może być w stanie użyć częściowego indeksu tylko dla osoby.
D nie może użyć żadnego z indeksów, ponieważ nie zna osoby.
Aby uzyskać więcej informacji, zobacz dokumentację mysql tutaj .
źródło
Możesz po prostu WYJĄTKOWY OGRANICZENIE. Zwłaszcza jeśli masz już klucz zastępczy. (przykładem już istniejącego klucza zastępczego byłaby pojedyncza kolumna o wartości AUTO_INCREMENT)
Poniżej znajduje się kod SQL unikalnego ograniczenia
źródło
źródło
Zdecydowanie lepiej jest użyć KOMPOZYTOWEGO UNIKALNEGO KLUCZA, jak oferował @GranadaCoder, choć jest to nieco trudny przykład:
ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);
źródło
ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);
źródło