Mysql пренареждане на auto_increment стойности

Проблеми и работа с Mysql, PosgreSQL, MSSQL, Oracle и интеграция с проектите ви.

Mysql пренареждане на auto_increment стойности

Мнениеот Blue на Сря Авг 25, 2010 12:30 pm

Здравейте съфорумци,
имам база данни с таблица "Groups", съдържаща две колони - id (auto_increment), GName; След запълването със стойности таблицата изглежда проблизително така:
Код: Избери целия код
      id    GName
         1   Лекари
         2   Клиники
         3   Пратки
         4   Доставчици

Ако изтрия реда с "Пратки" и номера си заминава, дали има някакъв начин за автоматично пренареждане на номерата в id или трябва да се пише функция за тази дейност.

Благодаря предварително за отделенот време!
██████████████████████████████████████████████████████████████████
В една държава, която се управлява с разум, бедността и нищетата са срамни.
А в държава, която се управлява без разум, богатството и почестите са срамни!


Аватар
Blue
Dream of nature
 
Мнения: 185
Регистриран на: Сря Авг 06, 2008 9:25 am
Местоположение: В света на мойта реалност.


Репутация: 14
Add reputation pointSubtract reputation point

Мнениеот metala на Сря Авг 25, 2010 12:47 pm

Най-простото решение което виждам е с транзакция (а може и без) да се изтрие записа и после да намалиш останалите id-та с 1.

Код: Избери целия код
START TRANSACTION;
DELETE FROM Groups WHERE id = 3;
UPDATE Groups SET id = id -1 WHERE id > 3;
ALTER TABLE table_name AUTO_INCREMENT = AUTO_INCREMENT - 1;
COMMIT;


Аватар
metala
Red Label
 
Мнения: 436
Регистриран на: Вто Авг 05, 2008 8:24 am
Местоположение: E00000-FFFFFF


Репутация: 45
Add reputation pointSubtract reputation point

Мнениеот kalata на Сря Авг 25, 2010 12:49 pm

Според мен по - добрият вариант е да създадеш ново поле което да указва номера на съответната група. ID-то ти е primary key и трябва да е уникално, нормално е като го изтриеш да остава дупка.

Единият вариант за сортиране е метода на балоните. http://en.wikipedia.org/wiki/Bubble_sort

А тук metala сцепи. Нямам какво да кажа !! :x


Аватар
kalata
Tri-Pi-o
Tri-Pi-o
 
Мнения: 2764
Регистриран на: Пон Авг 04, 2008 12:43 pm
Местоположение: Ин дъ мидъл оф ноуер


Репутация: 57
Add reputation pointSubtract reputation point

Мнениеот Blue на Сря Авг 25, 2010 1:22 pm

metala написа:Най-простото решение което виждам е с транзакция (а може и без) да се изтрие записа и после да намалиш останалите id-та с 1.

Код: Избери целия код
START TRANSACTION;
DELETE FROM Groups WHERE id = 3;
UPDATE Groups SET id = id -1 WHERE id > 3;
ALTER TABLE table_name AUTO_INCREMENT = AUTO_INCREMENT - 1;
COMMIT;

Здравей Metala,
след като прегледах доста алтернативи, за MySql , не намерих команда за преномериране на автоматичния брояч и следователно, това което написа по горе ми е най-добрия вариант. Мерси! Има само един малък недостатък, всяка транзакция може да обработи само един запис, т.е. ако изтрия на куп три записа веригата се къса, евентуално може да се добави брояч на изтритите записи и с толкова да се намалява, но пак остава проблема при не последователни редове.

@Калата - точно това е смисъла, да си останат уникални id-тата, но и да са поредни. Не мисля, че тук е приложим алгоритъма на балона, защото нямам нужда от алгоритъм за пренареждане на масив, а от функция за запазване поредността на id-тата.
██████████████████████████████████████████████████████████████████
В една държава, която се управлява с разум, бедността и нищетата са срамни.
А в държава, която се управлява без разум, богатството и почестите са срамни!


Аватар
Blue
Dream of nature
 
Мнения: 185
Регистриран на: Сря Авг 06, 2008 9:25 am
Местоположение: В света на мойта реалност.


Репутация: 14
Add reputation pointSubtract reputation point

Мнениеот kalata на Сря Авг 25, 2010 1:25 pm

Ти така и така триеш един по един ред а не триеш по 3 едновременно, няма да ти трябва, защото ще можеш на всеки дилийт да слагаш и този ъпдейт.


Аватар
kalata
Tri-Pi-o
Tri-Pi-o
 
Мнения: 2764
Регистриран на: Пон Авг 04, 2008 12:43 pm
Местоположение: Ин дъ мидъл оф ноуер


Репутация: 57
Add reputation pointSubtract reputation point

Мнениеот Blue на Сря Авг 25, 2010 1:33 pm

kalata написа:Ти така и така триеш един по един ред а не триеш по 3 едновременно, няма да ти трябва, защото ще можеш на всеки дилийт да слагаш и този ъпдейт.

На практика процеса по изтриване на множестово от записи може да се разбие на n на брой единични транзакции, съответно това което казваш е така, но винаги е по добре да минимизираш възможно най много обращенията тип Клиент > Сървърен скрипт > База данни. Това което ще се получи е нещо от рода:
при изтриване на три записа се реализират три извиквания на функцията и следователно три обръщения към базата, но всичко това е както каза по рано, просто ще си викам функцията за всеки изтрит запис.
Благодаря за отделеното време :) :bow:
██████████████████████████████████████████████████████████████████
В една държава, която се управлява с разум, бедността и нищетата са срамни.
А в държава, която се управлява без разум, богатството и почестите са срамни!


Аватар
Blue
Dream of nature
 
Мнения: 185
Регистриран на: Сря Авг 06, 2008 9:25 am
Местоположение: В света на мойта реалност.


Репутация: 14
Add reputation pointSubtract reputation point

Мнениеот Blue на Съб Сеп 04, 2010 11:13 am

metala написа:Най-простото решение което виждам е с транзакция (а може и без) да се изтрие записа и после да намалиш останалите id-та с 1.

Код: Избери целия код
START TRANSACTION;
DELETE FROM Groups WHERE id = 3;
UPDATE Groups SET id = id -1 WHERE id > 3;
ALTER TABLE table_name AUTO_INCREMENT = AUTO_INCREMENT - 1;
COMMIT;



Здравей метал,
ALTER TABLE table_name AUTO_INCREMENT = AUTO_INCREMENT - 1;
в този ред дава грешка, и аз намерих следното обяснение:
reset auto_increment using....
alter table "table_name" auto_increment=1
resets auto_increment to 1 + max(auto_increment)

и това е алтернативата на последния ред, и сега всичко работи без грешка :)
██████████████████████████████████████████████████████████████████
В една държава, която се управлява с разум, бедността и нищетата са срамни.
А в държава, която се управлява без разум, богатството и почестите са срамни!


Аватар
Blue
Dream of nature
 
Мнения: 185
Регистриран на: Сря Авг 06, 2008 9:25 am
Местоположение: В света на мойта реалност.


Репутация: 14
Add reputation pointSubtract reputation point


Назад към Бази данни


Подобни теми


Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта

cron