The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Автозаполнение столбцов для автоинкремента в 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)
 
02.08.2012 , Автор: Lennotoecom
Ключи: mysql, table, auto_increment / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / SQL и базы данных / MySQL специфика / Оптимизация и администрирование MySQL

Обсуждение [ RSS ]
  • 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;

     
  • 2.4, Lennotoecom (??), 23:56, 05/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Тем что "x" может быть любым?
     
     
  • 3.8, zoonman (ok), 21:03, 11/08/2012 [^] [^^] [^^^] [ответить]  
  • +/
    ALTER TABLE tTable AUTO_INCREMENT = 500;

    Перед моим вышеприведенным запросом.

    Гораздо интереснее переменные auto_increment_increment и  auto_increment_offset.
    Первая управляет шагом инкремента, а вторая начальным смещением.
    Это очень полезно при настройке репликации и масштабирования баз.

    http://dev.mysql.com/doc/refman/5.0/en/replication-options-master.html#sysvar

     

  • 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.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру