Сделать идентификатор в таблице mysql auto_increment (после факта)
Я приобрел базу данных у другого разработчика. Он не использовал auto_incrementers для любых таблиц. Все они имеют идентификаторы первичного ключа, но он все увеличивал вручную, в коде.
Могу ли я превратить их в Auto_incrementers?
Ничего себе, очень приятно, спасибо тонну. Он работал без сучка на одном из моих столов. Но вторая таблица, я получаю эту ошибку... Ошибка при переименовании '.\DBNAME # sql-6c8_62259c' to '.\DBNAME\dealer_master_events'
Ответы
Ответ 1
Например, вот таблица, которая имеет первичный ключ, но не является 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, которую вы упомянули в комментарии, это, вероятно, конфликт с ограничениями внешнего ключа. Мои извинения, после того, как я проверил это, я думал, что это будет работать. Вот несколько ссылок, которые могут помочь в диагностике проблемы:
Ответ 2
Ничего из этого не было сделано для моей таблицы. У меня есть таблица с целым числом без знака в качестве первичного ключа со значениями от 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;
Ответ 3
Я предполагаю, что вам не нужно повторно увеличивать существующие данные, поэтому почему вы не можете просто запустить команду ALTER TABLE для изменения атрибутов PK?
Что-то вроде:
ALTER TABLE `content` CHANGE `id` `id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT
Я тестировал этот код в своей собственной базе данных MySQL, и он работает, но я не пробовал его с каким-либо значимым количеством записей. После того, как вы изменили строку, вам нужно reset приращение к числу, гарантирующему, что оно не будет мешать другим записям.
ALTER TABLE `content` auto_increment = MAX(`id`) + 1
Опять же, непроверенный, но я считаю, что это сработает.
Ответ 4
Это сработало для меня (я хотел сделать id первичным и установить auto increment)
ALTER TABLE table_name
CHANGE id
id
INT PRIMARY KEY AUTO_INCREMENT;
Ответ 5
Да, легко. Просто запустите запрос определения данных для обновления таблиц, добавив столбец AUTO_INCREMENT.
Если у вас есть существующая база данных, будьте осторожны, чтобы сохранить какие-либо отношения внешнего ключа, которые могут уже присутствовать на "искусственно созданных" первичных ключах.
Ответ 6
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;
Ответ 7
Пока у вас есть уникальные целые числа (или какое-то уникальное значение) в текущем PK, вы можете создать новую таблицу и вставить в нее с IDENTITY INSERT ON. Затем отбросьте старую таблицу и переименуйте новую таблицу.
Не забудьте воссоздать любые индексы.