Удалить первичный ключ в MySQL - PullRequest
163 голосов
/ 21 января 2010

У меня есть следующая схема таблицы, которая отображает 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 и license_id и сохранить первичный ключ для id.1004 *

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

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 ]

261 голосов
/ 21 января 2010

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

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

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;
114 голосов
/ 21 января 2010

Одна строка:

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

Вы также не потеряете автоинкремент и должны будете добавить его заново, что может иметь побочные эффекты.

14 голосов
/ 21 января 2010

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

10 голосов
/ 21 января 2010
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;
6 голосов
/ 20 ноября 2015

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

5 голосов
/ 21 января 2010

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

Не должно быть вопроса о том, желательно или нет «восстанавливать свойство PK» и «восстанавливать свойство автоинкремента» столбца ID.

Учитывая, что это БЫЛО автоинкрементом в предыдущем определении таблицы, вполне вероятно, что существует какая-то программа, которая вставляется в эту таблицу без указания значения идентификатора (поскольку столбец идентификатора в любом случае является автоинкрементом).

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

3 голосов
/ 04 сентября 2014

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

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

1 голос
/ 22 июля 2017

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

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

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

0 голосов
/ 08 мая 2018

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

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

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

ALTER TABLE table_name DROP PRIMARY KEY;
0 голосов
/ 09 апреля 2018

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

...