сделайте идентификатор в mysql таблице auto_increment (после факта)

58
задан casperOne 4 September 2012 в 18:18
поделиться

5 ответов

Например, вот таблица, которая имеет первичный ключ, но не является 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 Вы упомянули в своем комментарии, это - вероятно, конфликт с ограничениями внешнего ключа. Мои извинения, после того, как я протестировал его, я думал, что это будет работать. Вот несколько ссылок, которые могут помочь диагностировать проблему:

106
ответ дан Community 24 November 2019 в 18:52
поделиться

Да, легкий. Просто выполните запрос определения данных для обновления таблиц, добавив столбец AUTO_INCREMENT.

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

0
ответ дан Alex Weinstein 24 November 2019 в 18:52
поделиться

Я предполагаю, что Вы не должны повторно увеличивать существующие данные так, почему Вы не можете только выполнить простую команду 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

Снова, непротестированный, но я полагаю, что это будет работать.

4
ответ дан Stephen Walcher 24 November 2019 в 18:52
поделиться

Пока у Вас есть уникальные целые числа (или некоторое уникальное значение) в текущем PK, Вы могли составить новую таблицу и вставить в нее с ИДЕНТИФИКАЦИОННЫМИ ДАННЫМИ, ВСТАВЛЯЮТ НА. Тогда отбросьте старую таблицу и переименуйте новую таблицу.

не забывают воссоздавать любые индексы.

-1
ответ дан Adam 24 November 2019 в 18:52
поделиться

Обратите внимание на то, что область нулевой страницы в нижней части адресного пространства не фактически запрещена для применения в обычных дистрибутивах 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;
5
ответ дан 24 November 2019 в 18:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: