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


186

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

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

Ответы:


295

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

Вы должны удалить свойство 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;

Разве тогда мне не пришлось бы восстанавливать столбец id как первичный ключ auto_increment? изменить таблицу user_customer_permission добавить первичный ключ (id); изменить таблицу user_customer_permission изменить id id int (11) auto_increment;
— markb

@markb: если вы восстановите первичный ключ, вы наверняка можете вернуть его обратно AUTO_INCREMENT.
— Quassnoi

что это означает, что столбец автоинкремента должен быть крайней левой частью ПЕРВИЧНОГО КЛЮЧА. ?
— Аруп Ракшит

1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/ ... Чтобы использовать AUTO_INCREMENTмеханизм с таблицей InnoDB, AUTO_INCREMENTстолбец ai_colдолжен быть определен как часть индекса, чтобы можно было выполнить эквивалент индексированного SELECT MAX(ai_col)поиска в таблице, чтобы получить максимальное значение столбца. Обычно это достигается за счет того, что столбец становится первым столбцом некоторого индекса таблицы.
— Quassnoi

он говорит, что PRIMARY не определен. Почему это происходит? Поэтому мне пришлось удалить и снова добавить столбец идентификатора без указания первичного ключа
— mrbengi

122

Одна линия:

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

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


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

Отлично ! Для меня удаление первичного ключа не сработало, даже если я изменил поле, чтобы избавиться от автоматического увеличения. Но это решение отлично работает!
— user2447161 04

14

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




5

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

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

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

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


3

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

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


1

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

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

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


1

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

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

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

ALTER TABLE table_name DROP PRIMARY KEY;

0

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


0

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.