Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2017, 13:39   #1
ddr111
Пользователь
 
Регистрация: 09.12.2008
Сообщений: 12
По умолчанию Переиндексация БД SQL

Приветствую!

Такой вопрос, есть база данных на SQL, как в Delphi (RAD Studio) при помощи добавленной на форму кнопки сделать переиндексацию базы?

Может не правильно выразился, попробую точнее.

1. Есть таблица в SQL.
2. По традиции первый столбец - уникальный идентификатор ID
3. В таблице нумерация ID начинается с 1 и далее пошло 2,3,4,5 при добавлении новых записей.
4. Если удаляешь какую либо запись, допустим 1, 3 и 4ю, то останутся записи с ID 2 и 5
5. при добавлении новой записи автоматически присваивается новый ID 6, таблица при этом имеет записи с ID 2,5,6.
6. Можно ли как то при нажатии Button на форме переиндексировать базу данных, чтоб ID приняли значения 1,2,3 а не 2,5,6?

P.S. Заранее спасибо!

Последний раз редактировалось ddr111; 01.04.2017 в 14:12.
ddr111 вне форума Ответить с цитированием
Старый 01.04.2017, 16:58   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

в теории можно, но ЗАЧЕМ это.

Если этот идентификатор используется для связей с другими таблицами(а именно это и есть его основное предназначение), то одновременно с этой перенумерацией (а не переиндексированием) потребуется и перенумерация всех прочих таблиц использующих данный идентификатор. И не дай бог какую-то таблицу пропустишь... Все, база пришла в НЕВЕРНОЕ состояние. выйти из которого поможет только backup c теми самыми номерами, которые ещё не были "упорядочены".

но если не передумал(не переубедили)
Код:
update t set id =id-1 where id >k --уменьшить все номера ПОСЛЕ k на единицу
и так много-много раз для каждого пропущенного числа k.

Код:
--может быть можно и так
update t set id = ( select count(*) from t as r where r.id >t.id )
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 01.04.2017, 18:31   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Обычно когда в качестве номера по порядку используют идентификатор такие грабли возникают. А автоинкремент для этого не предназначен. Порядковый номер легко на клиенте показать в вычисляемом поле, используя recno например
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 01.04.2017 в 18:35.
Аватар вне форума Ответить с цитированием
Старый 02.04.2017, 09:38   #4
ddr111
Пользователь
 
Регистрация: 09.12.2008
Сообщений: 12
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
в теории можно, но ЗАЧЕМ это.

Если этот идентификатор используется для связей с другими таблицами(а именно это и есть его основное предназначение), то одновременно с этой перенумерацией (а не переиндексированием) потребуется и перенумерация всех прочих таблиц использующих данный идентификатор. И не дай бог какую-то таблицу пропустишь... Все, база пришла в НЕВЕРНОЕ состояние. выйти из которого поможет только backup c теми самыми номерами, которые ещё не были "упорядочены".

но если не передумал(не переубедили)
Код:
update t set id =id-1 where id >k --уменьшить все номера ПОСЛЕ k на единицу
и так много-много раз для каждого пропущенного числа k.

Код:
--может быть можно и так
update t set id = ( select count(*) from t as r where r.id >t.id )
Спасибо большое, про связь таблиц я чёт не подумал (не вспомнил), но на данном этапе это будет моно таблица. Жесть конечно, более 15 лет назад программировал, вообще всё забыл.
ddr111 вне форума Ответить с цитированием
Старый 03.04.2017, 11:03   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
но на данном этапе это будет моно таблица
тем хуже.
Все изменяется и со временем будет несколько таблиц и появятся связи.
А про наличие "перенумерации" тем временем благополучно забыли (работает себе и работает).

И тут бац, через полгода выяснится что все не так как должно быть.
Ссылки идут совсем не на те записи как должно было бы быть.
Произошло то было описано выше и никто не знает когда же была сделана эта неправильная "перенумерация", т.е. неизвестно даже какому Backup можно верить.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как у пользователя SQL убрать права на остановку/перезагрузку MS SQL Server? R_G Общие вопросы по программированию, компьютерный форум 1 28.09.2016 06:27
Oracle. PL/SQL Dev. Выполнить много SQL'файлов по-порядку в 1 клик Человек_Борща SQL, базы данных 2 11.12.2014 12:12
Удаление строки с помощью SQL запроса (Query1.SQL.ADD('Delete....')) Schutze Помощь студентам 6 29.11.2009 22:15
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26