Удалить первичный ключ в MySQL

у меня есть следующая схема таблицы, которая сопоставляет user_customers с разрешениями на живую базу данных 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)

Я хотел бы удалить первичные ключи для user_customer_id и permission_id и сохранить первичный ключ для id.

когда я запускаю команду:

alter table user_customer_permission drop primary key;

Я получаю следующую ошибку:

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

как я могу удалить первичный ключ столбца?

11 ответов


без индекса поддержание столбца автоинкремента становится слишком дорогим, поэтому MySQL требует, чтобы столбец autoincrement был самой левой частью индекса.

перед удалением ключа необходимо удалить свойство autoincrement:

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

обратите внимание, что у вас есть композитные PRIMARY KEY который охватывает все три столбца и id не гарантируется, чтобы быть уникальным.

если это будет уникальным, вы можете сделать его PRIMARY KEY и AUTO_INCREMENT опять:

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

Одна Строка:

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

вы также не потеряете auto-increment и должны повторно добавить его, который может иметь побочные эффекты.


Я считаю, что квасной ответил на ваш прямой вопрос. Просто Примечание: возможно, это просто какая-то неловкая формулировка с вашей стороны, но у вас создается впечатление, что у вас есть три первичных ключа, по одному на каждом поле. Это не так. По определению, у вас может быть только один первичный ключ. Здесь у вас есть первичный ключ, состоящий из трех полей. Таким образом, вы не можете "удалить первичный ключ в столбце". Вы можете удалить первичный ключ или не удалять первичный ключ. Если вы хотите первичный ключ, включающий только один столбец, можно удалить существующий первичный ключ на 3 столбца и создать новый первичный ключ на 1 столбце.


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

"Если вы восстановите первичный ключ, вы обязательно можете вернуть его обратно в AUTO_INCREMENT"

не должно быть вопроса о том, желательно ли "восстановить свойство PK" и "восстановить свойство autoincrement" столбца ID.

учитывая, что это был автоинкремент в предыдущем определении таблицы, вполне вероятно, что существует некоторая программа, которая вставляет в эту таблицу без предоставления значения ID (потому что столбец ID является автоинкрементом в любом случае.)

любая операция такой программы будет прервана, не восстанавливая свойство autoincrement.


если у вас есть составной первичный ключ, сделайте так -ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);


сначала измените столбец, чтобы удалить поле auto_increment следующим образом: alter table user_customer_permission изменить идентификатор столбца int;

далее, отбросьте первичный ключ. alter table user_customer_permission drop primary key;


у меня была такая же проблема и у некоторые значения в моей таблице. Хотя я изменил свой первичный ключ с

ALTER TABLEuser_customer_permissionDROP PRIMARY KEY , ADD PRIMARY KEY ( id)

проблема продолжалась на моем сервере. Я создал новое поле внутри таблицы, я перенес значения в новое поле и удалил старое, проблема решена!!


сначала создайте резервную копию базы данных. Затем удалите любой внешний ключ, связанный с таблицей. усечь таблицу внешнего ключа.Усечь текущую таблицу. Удалите необходимые первичные ключи. Используйте sqlyog или workbench или heidisql или dbeaver или phpmyadmin.


найти таблицу в SQL manager щелкните ее правой кнопкой мыши и выберите дизайн, затем щелкните правой кнопкой мыши значок маленького ключа и выберите Удалить первичный ключ.


до добавить первичный ключ в столбце.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

до удалить первичный ключ из таблицы.

ALTER TABLE table_name DROP PRIMARY KEY;