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

148

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

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

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

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

Теги:
database-design
primary-key
mysql-error-1075

11 ответов

246
Лучший ответ

Без индекса сохранение столбца автоинкремента становится слишком дорогостоящим, поэтому 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;
  • 0
    Не пришлось бы мне тогда восстановить столбец id как первичный ключ auto_increment? изменить таблицу user_customer_permission добавить первичный ключ (id); изменить таблицу user_customer_permission id изменения id int (11) auto_increment;
  • 0
    @markb : если вы восстановите первичный ключ, вы можете вернуть его обратно к AUTO_INCREMENT .
Показать ещё 4 комментария
97

Одна строка:

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

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

  • 4
    Я думаю, что этот ответ должен всплывать наверх, так как он не только устраняет необходимость изменения определения поля, но также позволяет вносить изменения с помощью ограничений fk на изменяемую таблицу - действительно помог мне!
13

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

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

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

5

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

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

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

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

3

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

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

1

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

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

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

0

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

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

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

ALTER TABLE table_name DROP PRIMARY KEY;
0

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

  • 0
    Хотя этот пост может решить вопрос, в том числе скриншот действительно помогает улучшить качество вашего поста. Помните, что в будущем вы отвечаете на вопрос читателей, и эти люди могут не знать того же пользовательского интерфейса, на который вы смотрите.
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню