2010-01-21 22 views
138

Mam następujący schemat tabeli, która mapuje user_customers do pozwoleń na żywo bazy danych MySQL:Usuń klucz podstawowy w MySQL

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 user_customer_id i permission_id i zachować klucz podstawowy dla ID.

Kiedy uruchomić komendę:

alter table user_customer_permission drop primary key; 

pojawia się 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ść klucz podstawowy w kolumnie?

Odpowiedz

219

Bez indeksu utrzymanie kolumny autokorelacji staje się zbyt kosztowne, dlatego też kolumna autonumerowania wymaga, aby kolumna autorekrementacji była najbardziej na lewo częścią indeksu.

Należy usunąć właściwość autoIncrement przed zrzuceniem klucz:

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

Zauważ, że musisz kompozytowego PRIMARY KEY która obejmuje wszystkie trzy kolumny i id nie jest gwarantowane jest unikatowy.

Jeśli zdarza się wyjątkowy, można zrobić to być PRIMARY KEY i AUTO_INCREMENT ponownie:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT; 
+0

Ohh, pokonaj mnie! : P –

+0

Czy nie powinienem wtedy przywrócić kolumny id jako klucz podstawowy auto_increment? alter table user_customer_permission dodaj klucz podstawowy (id); alter table user_customer_permission zmiana id id int (11) auto_increment; – markb

+0

'@ markb': jeśli przywrócisz klucz podstawowy, możesz przywrócić go z powrotem do" AUTO_INCREMENT ". – Quassnoi

8
ALTER TABLE `user_customer_permission` MODIFY `id` INT; 
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY; 
11

wierzę Quassnoi odpowiedział na swoje bezpośrednie pytanie. Tylko jedna uwaga: może to tylko dziwne sformułowanie z twojej strony, ale wydajesz się mieć 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 tu masz, to klucz podstawowy złożony z trzech pól. W związku z tym nie można "upuścić klucza podstawowego w kolumnie". Możesz upuścić klucz podstawowy lub upuścić klucz podstawowy. Jeśli chcesz klucz podstawowy, który zawiera tylko jedną kolumnę, możesz usunąć istniejący klucz podstawowy z 3 kolumn i utworzyć nowy klucz podstawowy w 1 kolumnie.

+0

Dzięki @Jay, bardzo pomocne – markb

92

jednym wierszu:

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

też nie stracą automatycznego przyrostu i musiał ponownie go dodać co może mieć skutki uboczne.

+0

Perfect. +1 za trzymanie go w jednym wierszu – markb

+4

Myślę, że ta odpowiedź musi zostać uniesiona na szczyt, ponieważ nie tylko eliminuje potrzebę zmiany definicji pola, ale także umożliwia zmianę poprzez ograniczenie fk na stole - naprawdę pomogło odpadam! – tomfumb

+0

@markb: proszę zaznaczyć to jako zaakceptowaną odpowiedź! – Kip

4

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

nie powinno być pytanie, czy nie jest to pożądane, aby „przywrócić własność PK” i „przywrócić własność autoIncrement "z kolumny ID.

Biorąc pod uwagę, że W poprzedniej definicji tabeli BYŁO autodopasowania, jest całkiem prawdopodobne, że istnieje jakiś program wstawiający do tej tabeli bez podawania wartości identyfikatora (ponieważ kolumna ID i tak jest autoprzerywana).

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

2

Najpierw modyfikuj kolumnę, aby usunąć pole auto_increment w następujący sposób: alter table user_customer_permission zmień kolumnę id int;

Następnie upuść klucz podstawowy. alter table user_customer_permission upuść klucz podstawowy;

4

W przypadku gdy masz kompozytowy klucz podstawowy, zrobić jak to- ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

0

pierwszej kopii zapasowej bazy danych. Następnie upuść dowolny klucz obcy powiązany z tabelą. skrócić tabelę kluczy obcych. Obciążyć bieżącą tabelę. Usuń wymagane klucze podstawowe. Użyj sqlyog lub workbench lub heidisql lub dbeaver lub phpmyadmin.

1

Miałem ten sam problem i obok niektórych wartości w moim stole. Choć zmieniłem klucz podstawowy z

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

problemem kontynuowane na moim serwerze. Stworzyłem nowe pole wewnątrz stołu Przełożyłem wartości do nowego pola i usunąłem stary, problem rozwiązany !!

Powiązane problemy