Видаліть первинний ключ у MySQL


182

У мене є наступна схема таблиці, яка відображає дозволи 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 тазвору_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

Як я можу скинути первинний ключ стовпця?

Відповіді:


286

Без індексу підтримка стовпця з автоматичним збільшенням стає надто дорогим, тому 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;

Чи не довелося б мені тоді відновити стовпчик id як первинний ключ auto_increment? змінити таблицю user_customer_permission додати первинний ключ (id); змінити таблицю user_customer_permission change id id int (11) auto_increment;
марк

@markb: якщо ви відновите первинний ключ, ви впевнені, що можете повернути його назад AUTO_INCREMENT.
Quassnoi

що це означає, що стовпчик автоматичного збільшення є крайньою лівою частиною ПОЧАТКОВОГО КЛЮЧА. ?
Arup Rakshit

1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/… Щоб використовувати AUTO_INCREMENTмеханізм із таблицею InnoDB, AUTO_INCREMENTстовпець ai_colповинен бути визначений як частина індексу, щоб можна було виконати еквівалент індексованого SELECT MAX(ai_col)пошуку на таблиці, щоб отримати максимальне значення стовпця. Як правило, це досягається, роблячи стовпець першим стовпцем деякого індексу таблиці.
Quassnoi

в ньому сказано, що ПЕРВИЧНИЙ не визначений. Чому це відбувається? Тому мені довелося видалити та додати ще раз стовпчик ідентифікатора, не вказуючи первинний ключ
mrbengi

121

Один рядок:

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

Ви також не втратите автоматичне збільшення і вам доведеться повторно додавати його, що може мати побічні ефекти.


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

Ідеально! Для мене падіння первинного ключа не спрацювало, навіть якщо я змінив поле, щоб позбутися від автоматичного збільшення. Але це рішення прекрасно працює!
user2447161

14

Я вважаю, що Quassnoi відповів на ваше пряме запитання. Лише побічна примітка: Можливо, це лише якесь незручне формулювання з вашого боку, але вам здається, що ви відчуваєте, що у вас є три основні ключі, по одному в кожному полі. Це не так. За визначенням, ви можете мати лише один первинний ключ. У вас тут є первинний ключ, який складається з трьох полів. Таким чином, ви не можете "скинути первинний ключ на стовпець". Ви можете кинути первинний ключ, а не первинний ключ. Якщо ви хочете первинний ключ, що включає лише один стовпець, ви можете скинути існуючий первинний ключ на 3 стовпці та створити новий первинний ключ на 1 стовпчик.




5

"Якщо ви відновите первинний ключ, ви впевнені, що можете повернути його до AUTO_INCREMENT"

Не повинно виникати сумнівів, бажано чи "відновити властивість PK" та "відновити властивість автопосилення" стовпця ID.

Зважаючи на те, що в попередньому визначенні таблиці ВИНАГЛЯЛО автоматичне збільшення, цілком ймовірно, що існує якась програма, яка вставляється в цю таблицю, не надаючи значення ідентифікатора (тому що стовпчик ідентифікатора все одно є автоматичним збільшенням).

Будь-яка така робота програми буде порушена, не відновивши властивість автоматичного збільшення.


3

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

Далі, киньте первинний ключ. змінити первинний ключ drop_ 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-менеджері клацніть правою кнопкою миші та виберіть дизайн, потім клацніть правою кнопкою миші значок маленької клавіші та виберіть видалити первинний ключ.


Хоча ця публікація може вирішити питання, у тому числі скріншот дійсно допомагає покращити якість вашої публікації. Пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати того ж інтерфейсу, який ви дивитесь.
Пірат X
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.