Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Поиск и устранение "дырок" в таблице баз данных


Автор: byaka 19.7.2011, 13:38
Была создана таблица с autoincrement по ID полю. Пока тестили базу , натолкали кучу товаров на 10000, потом их удалии, теперь хотелось бы, заполнить таблицу новыми товарами так, чтобы заполнить все удаленные поля с неиспользуемыми идентификаторами. Зачем? Программа, которая обращается к таблице ограничена 65000 записями и 10000 будут полезны. Подскажите что-то? 

Автор: baldina 19.7.2011, 13:57
зависит от СУБД. Если в таблице нет записей, то в большинстве случаев - TRUNCATE TABLE

Автор: byaka 19.7.2011, 14:00
Цитата(baldina @ 19.7.2011,  13:57)
зависит от СУБД. Если в таблице нет записей, то в большинстве случаев - TRUNCATE TABLE

Microsoft Access

Автор: Zloxa 19.7.2011, 14:01
Цитата(baldina @  19.7.2011,  13:57 Найти цитируемый пост)
 в большинстве случаев

 smile 
я предполагаю только один случай, когда счетчик автоинкремента может сброситься транком, и то - не уверен. MyISAM? smile 

Автор: byaka 19.7.2011, 14:02
Цитата(byaka @ 19.7.2011,  14:00)
Цитата(baldina @ 19.7.2011,  13:57)
зависит от СУБД. Если в таблице нет записей, то в большинстве случаев - TRUNCATE TABLE

Microsoft Access

только мне не удалить надо, а сделать так, чтобы база начала инкремент с 1 и использовала незанятые значения для инкремента

Добавлено через 2 минуты и 5 секунд
вот, нарыл : http://support.microsoft.com/kb/812718/ru
поробую

Автор: Zloxa 19.7.2011, 14:07
Цитата(byaka @  19.7.2011,  14:02 Найти цитируемый пост)
нарыл 

Цитата

Удалите поле Счетчик из основной таблицы. 

 smile 

Автор: byaka 19.7.2011, 14:22
Цитата(Zloxa @ 19.7.2011,  14:07)
Цитата(byaka @  19.7.2011,  14:02 Найти цитируемый пост)
нарыл 

Цитата

Удалите поле Счетчик из основной таблицы. 

 smile

они предлагают скопировать в новую таблицу старую таблицу smile Что еще от мелкософта взять smile

Автор: baldina 19.7.2011, 14:23
Цитата(Zloxa @  19.7.2011,  14:01 Найти цитируемый пост)
я предполагаю только один случай, когда счетчик автоинкремента может сброситься транком, и то - не уверен. MyISAM?

ms sql http://msdn.microsoft.com/ru-ru/library/ms177570.aspx
mysql http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
про oracle точно не знаю
ms jet (access) - весьма условный sql движок, там все через попу. так что "рекомендация производителя" с пересозданием поля счетчика меня не удивляет. однако в mdb все проще: надо выполнить команду "сжать и восстановить базу данных", счетчики обнулятся

Автор: Zloxa 19.7.2011, 14:38
Цитата(baldina @  19.7.2011,  14:23 Найти цитируемый пост)
ms sql http://msdn.microsoft.com/ru-ru/library/ms177570.aspx

И где тут про сброс identity? Процитируй плиз.
Код

create table test (id int identity,val int);
insert into test(val) select 1 union all select 2 union all select 3;
select max(id) max_id from test;
insert into test(val) select 1 union all select 2 union all select 3;
select max(id) max_id from test;
drop table test;

Цитата

(3 row(s) affected)
max_id
-----------
3

(1 row(s) affected)

(3 row(s) affected)

max_id
-----------
6

(1 row(s) affected)


Цитата(baldina @  19.7.2011,  14:23 Найти цитируемый пост)
mysql http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html

Да, таки в масе все оказалось намного хуже..  smile 

Цитата(baldina @  19.7.2011,  14:23 Найти цитируемый пост)
про oracle точно не знаю

В оракле принципиально нет автоинкрементных полей. ЭТо тупиковая ветвь эволюции СУБД.

Автор: byaka 19.7.2011, 14:40
Цитата(baldina @ 19.7.2011,  14:23)
Цитата(Zloxa @  19.7.2011,  14:01 Найти цитируемый пост)
однако в mdb все проще: надо выполнить команду "сжать и восстановить базу данных", счетчики обнулятся 

не помогло, хотя мелкософт пишет, что все должно быть ок : http://office.microsoft.com/ru-ru/access-help/HP005187449.aspx !

Автор: Zloxa 19.7.2011, 14:43
Цитата(Zloxa @  19.7.2011,  14:38 Найти цитируемый пост)
И где тут про сброс identity? Процитируй плиз.

черт, я баран.... smile 
Код

create table test (id int identity,val int);
insert into test(val) select 1 union all select 2 union all select 3;
select max(id) max_id from test;
truncate table test;
insert into test(val) select 1 union all select 2 union all select 3;
select max(id) max_id from test;
drop table test;


Цитата

(3 row(s) affected)
max_id
-----------
3

(1 row(s) affected)

(3 row(s) affected)

max_id
-----------
3

(1 row(s) affected)

Автор: baldina 19.7.2011, 15:05
Цитата(byaka @  19.7.2011,  14:40 Найти цитируемый пост)
не помогло

всегда помогало...
какая версия access? какое расширение у файла БД?

Автор: byaka 19.7.2011, 15:27
Цитата(baldina @ 19.7.2011,  15:05)
Цитата(byaka @  19.7.2011,  14:40 Найти цитируемый пост)
не помогло

всегда помогало...
какая версия access? какое расширение у файла БД?

access - 2003 sp3, файл mdb

Автор: baldina 19.7.2011, 16:32
должно работать. счетчики не меняются в таблице, если она непуста. для пустой сбрасывается в 0

Автор: byaka 19.7.2011, 16:42
Цитата(baldina @ 19.7.2011,  16:32)
должно работать. счетчики не меняются в таблице, если она непуста. для пустой сбрасывается в 0

так она не пуста, как обнулить, только копированим как пишет мелкософт?

Автор: baldina 19.7.2011, 17:59
если не пуста, то наверно только копированием
возможно быстрее будет через временные таблицы: 
1. скопировать данные во временные таблицы при помощи INSERT INTO
2. очистить исходные  таблицы
3. сжать
4. скопировать данные обратно


Автор: byaka 20.7.2011, 11:46
Цитата(baldina @ 19.7.2011,  17:59)
если не пуста, то наверно только копированием
возможно быстрее будет через временные таблицы: 
1. скопировать данные во временные таблицы при помощи INSERT INTO
2. очистить исходные  таблицы
3. сжать
4. скопировать данные обратно

спс, попробую

Автор: baldina 20.7.2011, 11:51
Цитата(baldina @  19.7.2011,  17:59 Найти цитируемый пост)
при помощи INSERT INTO

SELECT INTO
сорри

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)