2009-07-29 5 views
4

Клиент мой случайно удалил около 500 записей из таблицы доступа, которая имеет первичное поле идентификатора, которое было создано как «autonumber». Отключив колонку автонабора (меняя назад на целое число), я смог восстановить отсутствующие 500 записей из резервной копии, но теперь, конечно, автонабор не может быть включен ...Проблема с доступом к автозагрузчику MS Access

Каковы возможные решения ? Поле ID используется как ссылка на другие таблицы, поэтому я не могу просто перенумеровать все, не перенумеровав все таблицы, которые ссылаются на это число (боль в шее, но возможно).

Есть ли какой-либо «трюк» для включения автоматического набора номера, используя max (id) в качестве отправной точки, если данные уже существуют в таблице?

+0

Я могу подтвердить, что метод Йосип работает, но я должен спросить. Разве у них нет резервной копии БД для этого самого случая? – JohnFx

ответ

4

Сделайте newTable с полем ID как AutoNumber (все поля должны быть такими же, как в исходной таблице, кроме ID). Скопируйте все данные из originalTable в Новая_таблица:

INSERT INTO newTable SELECT * FROM originalTable 

После того как данные заполнены, удалять и переименовывать originalTable Новая_таблица в originalTable.

Таким образом, все «дыры» в автоматической нумерации сохраняются, а функция newTable имеет автоматическую нумерацию.

P.S. Всегда старайтесь добавлять внешние ключи к своим идентификаторам. В этом случае, даже если некоторые данные будут удалены, вы, по крайней мере, будете иметь согласованное состояние.

+0

Не забудьте удалить и воссоздать отношения при удалении исходной таблицы и после переименования новой таблицы. Ваше последнее предложение не имеет для меня большого смысла. Есть несколько таблиц, которые не имеют внешних ключей. Хотя они обычно называются «ведущими» таблицами или справочными таблицами. Например, тип транзакции, страна или страна/таблица состояний. И я не совсем уверен, что вы подразумеваете под «согласованным состоянием» в этом случае. –

+0

Я согласен, что если бы эта БД была правильно настроена, ошибка не могла быть выполнена (по крайней мере, не так легко), увы, как и во многих проектах, я получаю звонок после того, как был нанесен урон. Доступ является одним из тех инструментов, которые позволят даже не программистам получить довольно приличное «решение», пока оно не развалится, потому что оно не настроено правильно. Я получаю много работы по увеличению количества клиентов до решений SQL-серверов, когда они понимают, что «joe in the mail room» не может действительно программироваться в конце концов:>) –

+0

Конечно, Access получает много неуважения, потому что люди делают с ним странные вещи не зная, что они делают. Но эй, лучше, чем использовать Excel или, что еще хуже, таблицы Word. –

0

Согласитесь, но можете добавить ORDER BY, чтобы убедиться, что AutoNumber находится в правильном порядке. В противном случае ваши другие таблицы будут иметь неправильную идентификационную связь.

INSERT INTO newTable SELECT * FROM originalTable ORDER BY ID 

Вы также должны явно назвать поля, вместо использования *

+0

Вам не нужны явные имена, если вторая таблица идентична первой (кроме поля ID). Заказ по ID здесь ничего не делает, поскольку автозамена «переопределяется» с идентификатором из инструкции SELECT (ID не выбирается свободно). Поскольку все идентификаторы берутся из исходной таблицы, новые идентификаторы не вводятся и не происходит неправильной ассоциации идентификаторов. –

+0

Согласен с *, не видел ваш комментарий «за исключением ID» в исходном сообщении. Но вам все равно потребуется ORDER BY. Когда он откладывает удаленные 500 записей, они собираются войти в таблицу в качестве последних строк. Таким образом, его оригинальная таблица имеет правильный идентификатор, но не в правильном порядке. Например, исходная таблица с удаленными строками добавлена ​​обратно: 1 Cat 2 Собакой 5 Лошадь 3 Mouse (добавлено назад) 4 Кролика (добавлен назад) Если скопировать их в новую таблицу без выполнения ORDER BY на ID и AutoNumber включен, вы получите: 1 Cat 2 Собака 3 Лошадь 4 Mouse 5 Rabbit неправильные идентификаторы –

1

Если бы я мог добавить к ответам.

Недостаточно известный факт, касающийся полей доступа к автозапуску, заключается в том, что счетчик на них сбрасывается при сжатии и восстановлении базы данных.

Я также уверен, что если вы сделаете вставку, она будет использовать числовой номер, а не следующий номер в счетчике автонабора, если он (больше) внутренний счетчик, сохраненный авто- номер поля (делает это смысл вообще?)

другими словами, вы можете сделать что-то вроде этого в новой таблице доступа, где счетчик должен быть установлен в 1 ...

INSERT INTO myTable (myAutoNumber,myOtherField) VALUES (10000,'other data') 

другой решения, упомянутые здесь, лучше, потому что они будут лучше выполнять гарантию результата, поэтому я упоминаю его почти по академическим причинам.

Сет

+0

Из Jet 4, вы можете также установить семя Autonumber в ADO код. –

+0

В Jet 3.5 (для Access 97) семена autonumber были сброшены на самый высокий идентификатор автозапуска в поле на компактном диске. Однако в Jet 4.0 (Access 2000 и новее) это происходит только тогда, когда в таблице нет записей, а семя устанавливается на 0. –

+0

Фактически вы можете вставить запись со значением в поле автонабора в «средний» стол. До тех пор, пока это значение autonumber еще не указано в таблице. Я только что протестировал currentdb.Execute ("INSERT INTO Table1 (ID, текстовое поле) VALUES (2, 'ID записи 2)) в окне Immediate, где ID - поле автонабора. –

1

Идеальное решение, хотя это уже слишком поздно, wouuld've было восстановить недостающие 500 записей в рабочем столе. Затем выполните запрос Append в основную таблицу. Это включало бы поле Autonumber.

0

Вы делаете новое поле и сделать его авто-номер, а затем удалить поле идентификатора и переименовать новое поле идентификатора