Задача:
В существующую таблицу добавить столбец, автоматически заполнить его от 1 до количества строк в таблице, сделать его ключевым с автоинкрементом.Решение:
Исходная таблица
mysql> select * from tTable;
+------+
| b |
+------+
| aa |
| ab |
| ac |
| ad |
| ae |
| af |
| ag |
| ah |
+------+
8 rows in set (0.00 sec)Добавляем столбец командой:
mysql> alter table tTable add a int;
теперь таблица имеет вид
mysql> select * from tTable;
+------+------+
| b | a |
+------+------+
| aa | NULL |
| ab | NULL |
| ac | NULL |
| ad | NULL |
| ae | NULL |
| af | NULL |
| ag | NULL |
| ah | NULL |
+------+------+
8 rows in set (0.00 sec)Собственно само автозаполнение:
mysql> set @x:=0; update tTable set a=(@x:=@x+1);
После чего таблица будет иметь вид
mysql> select * from tTable;
+------+------+
| b | a |
+------+------+
| aa | 1 |
| ab | 2 |
| ac | 3 |
| ad | 4 |
| ae | 5 |
| af | 6 |
| ag | 7 |
| ah | 8 |
+------+------+Делаем столбец ключом и автоинкрементом:
mysql> alter table tTable change a a int key auto_increment;
вид таблицы после изменения
mysql> show columns from tTable;
+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| b | char(2) | YES | | NULL | |
| a | int(11) | | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
2 rows in set (0.00 sec)URL:
Обсуждается: http://www.opennet.me/tips/info/2707.shtml
Не забудьте выставить блокировку перед update tTable set a=(@x:=@x+1) и снять ее после alter table tTable change a a int key auto_increment;
чем вся эта спистопляска отличается отalter table tTable add a int key auto_increment;
???
Ничем она не отличается.
Но лучше автоинкремент добавлять вот так:ALTER TABLE `tTable` ADD COLUMN `a` INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE;
Тем что "x" может быть любым?
ALTER TABLE tTable AUTO_INCREMENT = 500;Перед моим вышеприведенным запросом.
Гораздо интереснее переменные auto_increment_increment и auto_increment_offset.
Первая управляет шагом инкремента, а вторая начальным смещением.
Это очень полезно при настройке репликации и масштабирования баз.http://dev.mysql.com/doc/refman/5.0/en/replication-options-m...
Лучше скажите, как сделать что-то типа автоинкремента, но при этом не делать примари индекс? Тригеры?
зачем вообще это надо?
кроме ситуации когда "случайно" забыли сразу сделать ключ в таблице
Даже для этого оно не нужно. При добавлении уникального автоинкремент поля mysql автоматически его заполнит возрастающими значениями для все существующих записей. Причем, в отличии от этого вредного совета, сделает это без race condition.