Usuń klucz podstawowy z MySQL

182

Mam następujący schemat tabeli, który mapuje user_customers do uprawnień w bazie danych MySQL na żywo:

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Chciałbym usunąć klucze podstawowe dla id_użytkownika i id_użytkownika i zachować klucz podstawowy dla identyfikatora.

Po uruchomieniu polecenia:

alter table user_customer_permission drop primary key;

Otrzymuję następujący błąd:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

Jak mogę upuścić klucz podstawowy kolumny?

markb
źródło

Odpowiedzi:

286

Bez indeksu utrzymanie kolumny autowzrostu staje się zbyt drogie, dlatego MySQLkolumna autoinkrementacji musi być najbardziej lewą częścią indeksu.

Przed upuszczeniem klucza należy usunąć właściwość autoinkrementu:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

Pamiętaj, że masz kompozyt PRIMARY KEYobejmujący wszystkie trzy kolumny i idnie ma gwarancji, że będzie unikalny.

Jeśli okaże się, że jest wyjątkowy, możesz sprawić, aby był PRIMARY KEYi AUTO_INCREMENTznowu:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
Quassnoi
źródło
Czy nie musiałbym wtedy przywracać kolumny identyfikatora jako klucza podstawowego auto_increment? zmień tabelę user_customer_permission dodaj klucz podstawowy (id); alter table user_customer_permission change id id int (11) auto_increment;
markb 21.01.10
@markb: jeśli przywrócisz klucz podstawowy, na pewno możesz przywrócić go z powrotem do AUTO_INCREMENT.
Quassnoi
co to oznacza, że kolumna autowzrostu jest lewą częścią KLUCZA PODSTAWOWEGO. ?
Arup Rakshit,
1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/… Aby użyć AUTO_INCREMENTmechanizmu z tabelą InnoDB, AUTO_INCREMENTkolumna ai_colmusi być zdefiniowana jako część indeksu, aby można było wykonać odpowiednik SELECT MAX(ai_col)wyszukiwania indeksowanego w tabeli, aby uzyskać maksymalną wartość kolumny. Zazwyczaj osiąga się to, czyniąc kolumnę pierwszą kolumną jakiegoś indeksu tabeli.
Quassnoi
mówi, że PODSTAWOWE nie jest zdefiniowane. Dlaczego tak się dzieje? Musiałem więc usunąć i ponownie dodać kolumnę identyfikatora bez podawania klucza podstawowego
mrbengi
121

Jedna linia:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

Nie utracisz również automatycznego przyrostu i będziesz musiał go ponownie dodać, co może mieć skutki uboczne.

mluebke
źródło
5
Myślę, że ta odpowiedź musi zostać przeniesiona na samą górę, ponieważ nie tylko eliminuje potrzebę zmiany definicji pola, ale także pozwala na zmianę z ograniczeniami fk na stole, które są zmieniane - naprawdę mi pomogło!
tomfumb
Idealny ! Dla mnie upuszczenie klucza podstawowego nie działało, nawet jeśli zmienię pole, aby pozbyć się automatycznego przyrostu. Ale to rozwiązanie działa dobrze!
user2447161,
14

Wierzę, że Quassnoi odpowiedział na twoje bezpośrednie pytanie. Na marginesie: może to jest po prostu trochę niezręczne sformułowanie z twojej strony, ale wydaje się, że masz wrażenie, że masz trzy podstawowe klucze, po jednym na każdym polu. Nie o to chodzi. Z definicji możesz mieć tylko jeden klucz podstawowy. To, co masz tutaj, to klucz podstawowy, który składa się z trzech pól. Dlatego nie można „upuścić klucza podstawowego na kolumnę”. Możesz upuścić klucz podstawowy lub nie upuszczać klucza podstawowego. Jeśli chcesz, aby klucz podstawowy zawierał tylko jedną kolumnę, możesz upuścić istniejący klucz podstawowy na 3 kolumny i utworzyć nowy klucz podstawowy na 1 kolumnie.

Sójka
źródło
11
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;
Alix Axel
źródło
7

Jeśli masz złożony klucz podstawowy, zrób tak: ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

Visvendra Singh Rajpoot
źródło
5

„jeśli przywrócisz klucz podstawowy, na pewno możesz przywrócić go z powrotem do AUTO_INCREMENT”

Nie powinno być wątpliwości, czy pożądane jest „przywrócenie właściwości PK” i „przywrócenie właściwości autoinkrementacji” kolumny ID.

Biorąc pod uwagę, że BYŁO to autoinkrementacja we wcześniejszej definicji tabeli, jest całkiem prawdopodobne, że istnieje jakiś program, który wstawia się do tej tabeli bez podawania wartości identyfikatora (ponieważ kolumna ID i tak jest autokrementacją).

Każda taka operacja programu zostanie przerwana, nie przywracając właściwości autoinkrementu.

Erwin Smout
źródło
3

Najpierw zmodyfikuj kolumnę, aby usunąć pole auto_increment w następujący sposób: alter table user_customer_permission zmodyfikuj identyfikator kolumny int;

Następnie upuść klucz podstawowy. zmień tabelę user_customer_permission upuść klucz podstawowy;

John Gunderman
źródło
2
ALTER TABLE `table_name` ADD PRIMARY KEY( `column_name`);
Malith Ileperuma
źródło
1

Miałem ten sam problem i oprócz niektórych wartości w mojej tabeli. Chociaż zmieniłem mój klucz podstawowy za pomocą

ALTER TABLEuser_customer_permission DROP PRIMARY KEY , ADD PRIMARY KEY (id)

problem nadal występuje na moim serwerze. Utworzyłem nowe pole w tabeli Przeniesiłem wartości do nowego pola i usunąłem stare, problem rozwiązany !!

Sam
źródło
1

Aby dodać klucz podstawowy w kolumnie.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

Aby usunąć klucz podstawowy z tabeli.

ALTER TABLE table_name DROP PRIMARY KEY;
sumit katiyar
źródło
0

Najpierw wykonaj kopię zapasową bazy danych. Następnie upuść dowolny klucz obcy powiązany z tabelą. obciąć tabelę kluczy obcych. obciąć bieżącą tabelę. Usuń wymagane klucze podstawowe. Użyj narzędzia sqlyog lub workbench, heidisql lub dbeaver lub phpmyadmin.

Noby Nirmal
źródło
0

Znajdź tabelę w menedżerze SQL, kliknij ją prawym przyciskiem myszy i wybierz projekt, a następnie kliknij prawym przyciskiem myszy małą ikonę klucza i wybierz usuń klucz podstawowy.

Noob Helper
źródło
Chociaż ten post może rozwiązać pytanie, dołączenie zrzutu ekranu naprawdę pomaga poprawić jego jakość. Pamiętaj, że w przyszłości odpowiadasz na pytanie czytelników, a ci ludzie mogą nie znać tego samego interfejsu użytkownika, na który patrzysz.
Pirate X