Muranx
@Muranx
кто понял this тот в цирке не смеётся

Как удалить primary key с auto increment?

Здравствуйте!

Пытаюсь удалить аттрибут PRIMARY KEY из представленной ниже таблицы!

+---------------+-------------+------+-----+---------+----------------+
| Field         | Type        | Null | Key | Default | Extra          |
+---------------+-------------+------+-----+---------+----------------+
| doughnut_name | varchar(10) | YES  |     | NULL    |                |
| doughnut_type | varchar(6)  | YES  |     | NULL    |                |
| id            | int         | NO   | PRI | NULL    | auto_increment |
+---------------+-------------+------+-----+---------+----------------+

команда
ALTER TABLE `doughnut_list`
DROP PRIMARY KEY ;


Выбрасывается ошибка : "ERROR: 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key"

Вроде бы понятно на что он ругается, что "здесь может быть только одна колонка с автозаполнением и она должна быть объявлена как ключ"( ну из этой каряво переведённой фразы мне понятно лишь что он ругается на автоинкремент)

Я ПЕРЕсоздал новое свойсто id но уже без AUTO_INCREMENT но с PRIMARY KEY

+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| doughnut_name | varchar(10) | YES  |     | NULL    |       |
| doughnut_type | varchar(6)  | YES  |     | NULL    |       |
| id            | int         | NO   | PRI | NULL    |       |
+---------------+-------------+------+-----+---------+-------+


и выполняя команду ALTER TABLE `doughnut_list` DROP PRIMARY KEY; соотвественно получаем ожидаемый результат :

+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| doughnut_name | varchar(10) | YES  |     | NULL    |       |
| doughnut_type | varchar(6)  | YES  |     | NULL    |       |
| id            | int         | NO   |     | NULL    |       |
+---------------+-------------+------+-----+---------+-------+

Но я чот запутался, если сама колонка с именем id не удаляется, то почему тогда интерпретатор скл ругается на AUTO_INCREMENT? ну удалился бы этот PRIMARY KEY но колонка то осталась бы, всмылсе id? Не понимаю этой механики т.е. получается чтобы удалить колонку которая является PRIMARY KEY и которая имеет так-же AUTO_INCREMENT нужно удалять её полностью, и пересоздавать? Или всё же есть способ сделать это в одну команду без пересоздания колонки? И вообще в чём связь PRIMARY KEY и AUTO_INCREMENT в данном случае? Почему получается эта ошибка , что мол нельзя дропнуть праймари ки, пока на этой колонке висит AUTO_INCREMENT? Колонка то по факту не удаляется, ну и пусть бы была себе с этим AUTO_INCREMENT-том...
  • Вопрос задан
  • 558 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Если поле объявлено как AUTO_INCREMENT, то оно ОБЯЗАНО быть первичным ключом либо его префиксом. Если удалить PRIMARY KEY, но НЕ удалить AUTO_INCREMENT, результирующая структура не будет отвечать этому требованию - поэтому возникает ошибка.

Следовательно, в одном ALTER TABLE следует выполнить обе операции - и удалить первичный ключ, и атрибут AUTO_INCREMENT (например, изменить на DEFAULT {значение}). Либо выполнить два ALTER TABLE, но в обратном порядке - сначала удалить атрибут AUTO_INCREMENT, и только потом первичный ключ.

DEMO
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы