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