Например, вот таблица, которая имеет первичный ключ, но не является 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.
я также протестировал с [1 111] и зависимая таблица. При изменении id
определение столбца не прерывает ссылочную целостность.
Для ответа на ошибку 150 Вы упомянули в своем комментарии, это - вероятно, конфликт с ограничениями внешнего ключа. Мои извинения, после того, как я протестировал его, я думал, что это будет работать. Вот несколько ссылок, которые могут помочь диагностировать проблему:
Да, легкий. Просто выполните запрос определения данных для обновления таблиц, добавив столбец AUTO_INCREMENT.
, Если у Вас есть существующая база данных, стараться сохранить какие-либо отношения внешнего ключа, которые могли бы уже быть там на "искусственно созданных" первичных ключах.
Я предполагаю, что Вы не должны повторно увеличивать существующие данные так, почему Вы не можете только выполнить простую команду 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
Снова, непротестированный, но я полагаю, что это будет работать.
Пока у Вас есть уникальные целые числа (или некоторое уникальное значение) в текущем PK, Вы могли составить новую таблицу и вставить в нее с ИДЕНТИФИКАЦИОННЫМИ ДАННЫМИ, ВСТАВЛЯЮТ НА. Тогда отбросьте старую таблицу и переименуйте новую таблицу.
не забывают воссоздавать любые индексы.
Обратите внимание на то, что область нулевой страницы в нижней части адресного пространства не фактически запрещена для применения в обычных дистрибутивах Linux. Ядро, использовавшееся для этого, затем получило это решение в модуль LSM (например, SELinux, AppArmor). И они не применяли то же правило, поэтому оказалось возможным, чтобы процессы отображали память в 0x0. Это было частью уязвимости недавних эксплойтов «kernel null pointer dereference».
-121--4561390- Ни одно из вышеперечисленных не работало для моего стола. У меня есть таблица с целым числом без знака в качестве первичного ключа со значениями от 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;