сделать ID в MySQL таблице auto_increment (по факту) - PullRequest
58 голосов
/ 30 октября 2008

Я приобрел базу данных у другого разработчика. Он не использовал auto_incrementers ни для каких таблиц. Все они имеют идентификаторы первичного ключа, но он сделал все приращение вручную в коде.

Могу ли я превратить их в Auto_incrementers сейчас?


Ух, очень мило, спасибо за тонну. Это работало безотказно на одном из моих столов. Но во второй таблице я получаю эту ошибку ... Ошибка при переименовании файла.

Ответы [ 7 ]

105 голосов
/ 30 октября 2008

Например, вот таблица, которая имеет первичный ключ, но не AUTO_INCREMENT:

mysql> CREATE TABLE foo (
  id INT NOT NULL,
  PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);

Вы можете MODIFY столбец переопределить его с помощью опции AUTO_INCREMENT:

mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;

Убедитесь, что это вступило в силу:

mysql> SHOW CREATE TABLE foo;

Выходы:

CREATE TABLE foo (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1

Обратите внимание, что вы изменили определение столбца на месте, не требуя создания второго столбца и удаления исходного столбца. На ограничение PRIMARY KEY это не влияет, и вам не нужно указывать это в операторе ALTER TABLE.

Далее вы можете проверить, что вставка генерирует новое значение:

mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
mysql> SELECT * FROM foo;

Выходы:

+----+
| id |
+----+
|  1 | 
|  2 | 
|  5 | 
|  6 | 
+----+
4 rows in set (0.00 sec)

Я проверял это на MySQL 5.0.51 на Mac OS X.

Я также проверил с ENGINE=InnoDB и зависимой таблицей. Изменение определения столбца id не нарушает ссылочную целостность.


Чтобы ответить на ошибку 150, которую вы упомянули в комментарии, это, вероятно, конфликт с ограничениями внешнего ключа. Мои извинения, после того, как я проверил это, я думал, что это будет работать. Вот несколько ссылок, которые могут помочь диагностировать проблему:

5 голосов
/ 12 января 2010

Ничто из вышеперечисленного не сработало для моего стола. У меня есть таблица с целым числом без знака в качестве первичного ключа со значениями от 0 до 31543. В настоящее время существует более 19 тысяч записей. Мне пришлось изменить столбец на AUTO_INCREMENT (MODIFY COLUMN 'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT) и установить начальное число (AUTO_INCREMENT = 31544) в том же выражении.

ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544;
4 голосов
/ 30 октября 2008

Я предполагаю, что вам не нужно повторно увеличивать существующие данные, поэтому, почему вы не можете просто запустить простую команду ALTER TABLE, чтобы изменить атрибуты PK?

Что-то вроде:

ALTER TABLE `content` CHANGE `id` `id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT 

Я тестировал этот код в своей собственной базе данных MySQL, и он работает, но я не пробовал его с каким-либо значительным количеством записей. После того, как вы изменили строку, вам нужно сбросить приращение на число, которое гарантированно не помешает другим записям.

ALTER TABLE `content` auto_increment = MAX(`id`) + 1

Опять же, не проверено, но я верю, что это сработает.

2 голосов
/ 22 февраля 2014

Это сработало для меня (я хотел сделать id первичным и установить автоинкремент)

ALTER TABLE table_name CHANGE id id INT ПЕРВИЧНЫЙ КЛЮЧ AUTO_INCREMENT;

0 голосов
/ 12 апреля 2019
ALTER TABLE `foo` MODIFY COLUMN `bar_id` INT NOT NULL AUTO_INCREMENT;

или

ALTER TABLE `foo` CHANGE `bar_id` `bar_id` INT UNSIGNED NOT NULL AUTO_INCREMENT;

Но ничего из этого не сработает, если ваш bar_id является внешним ключом в другой таблице: вы получите

an error 1068: Multiple primary key defined

Чтобы решить эту проблему, временно отключите проверки ограничений внешнего ключа на

set foreign_key_checks = 0;

и после запуска приведенных выше операторов снова включите их.

set foreign_key_checks = 1;
0 голосов
/ 30 октября 2008

Да, просто. Просто запустите запрос определения данных, чтобы обновить таблицы, добавив столбец AUTO_INCREMENT.

Если у вас есть существующая база данных, соблюдайте осторожность, чтобы сохранить любые связи внешних ключей, которые могут уже присутствовать в «искусственно созданных» первичных ключах.

0 голосов
/ 30 октября 2008

Пока у вас есть уникальные целые числа (или какое-то уникальное значение) в текущем ПК, вы можете создать новую таблицу и вставить в нее с IDENTITY INSERT ON. Затем удалите старую таблицу и переименуйте новую таблицу.

Не забудьте заново создать индексы.

...