Entfernen Sie den Primärschlüssel in MySQL

181

Ich habe das folgende Tabellenschema, das user_customers Berechtigungen für eine Live-MySQL-Datenbank zuordnet:

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)

Ich möchte die Primärschlüssel für Benutzer-Benutzer-ID und Berechtigungs-ID entfernen und den Primärschlüssel für ID beibehalten.

Wenn ich den Befehl ausführe:

alter table user_customer_permission drop primary key;

Ich erhalte folgende Fehlermeldung:

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

Wie kann ich den Primärschlüssel einer Spalte löschen?

markb
quelle

Antworten:

285

Ohne Index wird die Verwaltung einer Autoincrement-Spalte zu teuer MySQL muss eine Autoincrement-Spalte ein Teil eines Index ganz links sein.

Sie sollten die Autoincrement-Eigenschaft entfernen, bevor Sie den Schlüssel ablegen:

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

Beachten Sie, dass Sie einen Verbund haben, PRIMARY KEYder alle drei Spalten und abdecktid nicht garantiert eindeutig ist.

Wenn es einzigartig ist, können Sie es zu einem PRIMARY KEYund AUTO_INCREMENTwieder machen:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
Quassnoi
quelle
Müsste ich dann nicht die ID-Spalte als Auto_Increment-Primärschlüssel wiederherstellen? Tabelle ändern user_customer_permission Primärschlüssel (ID) hinzufügen; Tabelle ändern user_customer_permission ID ändern int (11) auto_increment;
Markb
@markb: Wenn Sie den Primärschlüssel wiederherstellen, können Sie ihn sicher wieder herstellen AUTO_INCREMENT.
Quassnoi
Was bedeutet dies, dass die Spalte für die automatische Inkrementierung ein Teil des PRIMARY KEY ganz links ist? ?
Arup Rakshit
1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/… Um den AUTO_INCREMENTMechanismus mit einer InnoDB-Tabelle zu verwenden, muss eine AUTO_INCREMENTSpalte ai_colals Teil eines Index definiert werden, sodass das Äquivalent einer indizierten SELECT MAX(ai_col)Suche ausgeführt werden kann auf der Tabelle, um den maximalen Spaltenwert zu erhalten. In der Regel wird dies erreicht, indem die Spalte zur ersten Spalte eines Tabellenindex gemacht wird.
Quassnoi
es heißt, PRIMARY ist nicht definiert. Warum tritt das auf? Also musste ich die ID-Spalte löschen und erneut hinzufügen, ohne den Primärschlüssel anzugeben
mrbengi
121

Eine Linie:

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

Sie werden auch das automatische Inkrement nicht verlieren und müssen es erneut hinzufügen, was Nebenwirkungen haben könnte.

mluebke
quelle
5
Ich denke, diese Antwort muss nach oben schweben, da sie nicht nur die Änderung der Felddefinition überflüssig macht, sondern auch die Änderung mit fk-Einschränkungen für die zu ändernde Tabelle ermöglicht - hat mir wirklich geholfen!
Tomfumb
Perfekt ! Für mich hat das Löschen des Primärschlüssels nicht funktioniert, auch wenn ich das Feld geändert habe, um das automatische Inkrement zu entfernen. Aber diese Lösung funktioniert gut!
user2447161
14

Ich glaube, Quassnoi hat Ihre direkte Frage beantwortet. Nur eine Randnotiz: Vielleicht ist dies nur eine unangenehme Formulierung von Ihrer Seite, aber Sie scheinen den Eindruck zu haben, dass Sie drei Primärschlüssel haben, einen auf jedem Feld. Das ist nicht der Fall. Per Definition können Sie nur einen Primärschlüssel haben. Was Sie hier haben, ist ein Primärschlüssel, der aus drei Feldern besteht. Daher können Sie den Primärschlüssel nicht in einer Spalte ablegen. Sie können den Primärschlüssel löschen oder den Primärschlüssel nicht löschen. Wenn Sie einen Primärschlüssel möchten, der nur eine Spalte enthält, können Sie den vorhandenen Primärschlüssel in drei Spalten ablegen und einen neuen Primärschlüssel in einer Spalte erstellen.

Jay
quelle
11
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;
Alix Axel
quelle
7

Wenn Sie einen zusammengesetzten Primärschlüssel haben, gehen Sie wie folgt vor: ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

Visvendra Singh Rajpoot
quelle
5

"Wenn Sie den Primärschlüssel wiederherstellen, können Sie ihn sicher wieder auf AUTO_INCREMENT zurücksetzen."

Es sollte keine Frage geben, ob es wünschenswert ist, "die PK-Eigenschaft wiederherzustellen" und "die Autoincrement-Eigenschaft wiederherzustellen" der ID-Spalte.

Da es sich bei der vorherigen Definition der Tabelle um eine automatische Inkrementierung handelte, ist es sehr wahrscheinlich, dass ein Programm vorhanden ist, das ohne Angabe eines ID-Werts in diese Tabelle eingefügt wird (da die ID-Spalte ohnehin automatisch inkrementiert wird).

Der Betrieb eines solchen Programms wird unterbrochen, indem die Autoincrement-Eigenschaft nicht wiederhergestellt wird.

Erwin Smout
quelle
3

Ändern Sie zuerst die Spalte, um das Feld auto_increment wie folgt zu entfernen: alter table user_customer_permission change column id int;

Lassen Sie als Nächstes den Primärschlüssel fallen. Tabelle ändern user_customer_permission Primärschlüssel löschen;

John Gunderman
quelle
2
ALTER TABLE `table_name` ADD PRIMARY KEY( `column_name`);
Malith Ileperuma
quelle
1

Ich hatte das gleiche Problem und neben einigen Werten in meiner Tabelle. Obwohl ich meinen Primärschlüssel mit geändert habe

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

Problem auf meinem Server fortgesetzt. Ich habe ein neues Feld in der Tabelle erstellt. Ich habe die Werte in ein neues Feld übertragen und das alte gelöscht. Das Problem wurde gelöst.

Sam
quelle
1

Um hinzuzufügen Primärschlüssel in der Spalte.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

So entfernen Sie den Primärschlüssel aus der Tabelle.

ALTER TABLE table_name DROP PRIMARY KEY;
sumit katiyar
quelle
0

Sichern Sie zuerst die Datenbank. Löschen Sie dann einen der Tabelle zugeordneten Fremdschlüssel. Schneiden Sie die Fremdschlüsseltabelle ab. Schneiden Sie die aktuelle Tabelle ab. Entfernen Sie die erforderlichen Primärschlüssel. Verwenden Sie sqlyog oder workbench oder heidisql oder dbeaver oder phpmyadmin.

Noby Nirmal
quelle
0

Suchen Sie die Tabelle in SQL Manager, klicken Sie mit der rechten Maustaste darauf und wählen Sie Design aus. Klicken Sie dann mit der rechten Maustaste auf das kleine Schlüsselsymbol und wählen Sie Primärschlüssel entfernen.

Noob Helfer
quelle
Während dieser Beitrag die Frage lösen kann, hilft das Einfügen eines Screenshots wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage in Zukunft für Leser beantworten und diese Personen möglicherweise nicht dieselbe Benutzeroberfläche kennen, die Sie sich ansehen.
Pirat X