Как добавить авто-инкрементирование?

121
30 мая 2021, 00:30

Пытаюсь добавить свойство авто-инкрементирования в таблицу person для поля person_id: Запрос ниже.

ALTER TABLE person MODIFY person_id SMALLINT(5) UNSIGNED AUTO_INCREMENT;

Но ошибка: ERROR 1833 (HY000): Cannot change column 'person_id': used in a foreign key constraint 'pk_person_id' of table 'glava.favourite_food' mysql>

table person:

+-------------+----------------------+------+-----+---------+-------+
| Field       | Type                 | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+---------+-------+
| person_id   | smallint(5) unsigned | NO   | PRI | NULL    |       |
| fname       | varchar(20)          | YES  |     | NULL    |       |
| lname       | varchar(20)          | YES  |     | NULL    |       |
| gender      | enum('M','F')        | YES  |     | NULL    |       |
| birth_date  | date                 | YES  |     | NULL    |       |
| address     | varchar(30)          | YES  |     | NULL    |       |
| city        | varchar(20)          | YES  |     | NULL    |       |
| state       | varchar(20)          | YES  |     | NULL    |       |
| country     | varchar(20)          | YES  |     | NULL    |       |
| postal_code | varchar(20)          | YES  |     | NULL    |       |
+-------------+----------------------+------+-----+---------+-------+

table favourite_food:

+-----------+----------------------+------+-----+---------+-------+
| Field     | Type                 | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+-------+
| person_id | smallint(5) unsigned | NO   | PRI | NULL    |       |
| food      | varchar(20)          | NO   | PRI | NULL    |       |
+-----------+----------------------+------+-----+---------+-------+

Почему нельзя изменить и каким образом этого все-таки добиться?

Answer 1

Перед выполнением альтера отключите проверку внешних ключей:

SET FOREIGN_KEY_CHECKS = 0;

А после альтера верните назад:

SET FOREIGN_KEY_CHECKS = 1;

Проверял вот такими запросами в отладчике:

drop table if exists favourite_food_1012533;
drop table if exists person_1012533;
create table person_1012533 (
    person_id SMALLINT UNSIGNED,
    PRIMARY KEY (person_id)
) ENGINE=INNODB;
create table favourite_food_1012533 (
    id INT,
    person_id SMALLINT UNSIGNED,
    INDEX person_id_idx (person_id),
    FOREIGN KEY (person_id) REFERENCES person_1012533(person_id) ON DELETE CASCADE
) ENGINE=INNODB;
SET FOREIGN_KEY_CHECKS = 0;
ALTER TABLE person_1012533 MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
SET FOREIGN_KEY_CHECKS = 1;
show create table person_1012533;

Всё ОК!

READ ALSO
Добавить слово в строку

Добавить слово в строку

Как в нужную строку добавить словоЕсть текст в text

89
Как поправить меню категорий?

Как поправить меню категорий?

Уважаемые знатоки, внимание вопрос : Как убрать из submenu все эти дивы и i, и заменить на ссылки?

118
Запись строк массива по файлам

Запись строк массива по файлам

Имеется массив строкПользователь вводит число строк для разбиения и создаются файлы

104