Автозаполнение столбцов для автоинкремента в MySQL |
[исправить] |
Задача:
В существующую таблицу добавить столбец, автоматически заполнить его от 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)
|
|
|
|
Раздел: Корень / Программисту и web-разработчику / SQL и базы данных / MySQL специфика / Оптимизация и администрирование MySQL |
1.1, kornel (?), 15:32, 04/08/2012 [ответить]
| +/– |
Не забудьте выставить блокировку перед update tTable set a=(@x:=@x+1) и снять ее после alter table tTable change a a int key auto_increment;
| |
1.2, юзер (??), 11:32, 05/08/2012 [ответить]
| +1 +/– |
чем вся эта спистопляска отличается от
alter table tTable add a int key auto_increment;
???
| |
|
2.3, zoonman (ok), 16:40, 05/08/2012 [^] [^^] [^^^] [ответить]
| +1 +/– |
Ничем она не отличается.
Но лучше автоинкремент добавлять вот так:
ALTER TABLE 'tTable' ADD COLUMN 'a' INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE;
| |
|
1.5, Анонимус42 (?), 11:50, 07/08/2012 [ответить]
| +/– |
Лучше скажите, как сделать что-то типа автоинкремента, но при этом не делать примари индекс? Тригеры?
| |
1.6, alexxisr (?), 07:25, 08/08/2012 [ответить]
| +/– |
зачем вообще это надо?
кроме ситуации когда "случайно" забыли сразу сделать ключ в таблице
| |
|
2.7, angra (ok), 21:06, 10/08/2012 [^] [^^] [^^^] [ответить]
| +/– |
Даже для этого оно не нужно. При добавлении уникального автоинкремент поля mysql автоматически его заполнит возрастающими значениями для все существующих записей. Причем, в отличии от этого вредного совета, сделает это без race condition.
| |
|
|