Удалить первичный ключ в 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.