Если ты специалист, то ты сможешь ответить на этот вопрос!
Есть база данных Access с таблицами и связями. Необходимо программно поменять ключевой поле с типа числового на счетчик с сохранением последовательности, которая была в числовом поле. Данная таблица связана с другой таблицей.
С базами данных почти не работаю, поэтому у меня такой порядок действия по такой проблеме:
1. прочитать все таблицу в память
2. удалить связь с другой таблицей
3. удалить таблицу
4. создать таблицу с другими параметрами
5. записать в таблицу старые данные, учитывая последовательность
Застрял на 2 пункте.
Работаю через ADO на VС++. Могу получить через adSchemaTableConstraints собственно CONSTRAINT таблицы, в которой необходимо удалить связь. У меня это оказывается PrimaryKey. Удалить его таким запросом:
ALTER TABLE <имя таблицы> DROP CONSTRAINT PRIMARYKEY
не получается. Говорит, что он используется.
Хотя можно получить и имя внешнего ключа, но в Access такого запроса:
ALTER TABLE <имя таблицы> DROP FOREIGNKEY <имя внешнего ключа>
просто нет, так что это мне не помогло.
Может, кто знает более легкий путь или как мне удалить связь в таблице?
P.S. если создаю свою базу, SQL запросами, то все удаляется и создается хорошо
Заранее благодарю, Леонид
Re: Есть специалисты по базам данных на этом форуме?!
Здравствуйте, alico, Вы писали:
A>Боюсь, что на вопрос, поставленный в такой форме Вы ответа не получите
A>Максимум, что Вы узнаете — это что аксесс не является базой данных и все такое
Я тоже не считаю Access базой данных.
Но проблема была поставлена, и ее надо как-то решить.
Переформулирую немного вопрос, хотя мне кажется все описано самым подробным способом.
Что имеется:
1. База данных Access с таблицами и связями. Создавал не я. Вероятно, делали просто Access и не совсем правильно.
2. Есть таблица, в которой индекс это числовое поле (с уникальными значениями). Данный индекс связан с другой таблицей, та в свою очередь еще с одной и т.д.
3. Во всех таблицах имеются записи.
Что требуется:
Оставить все записи без изменения, и поменять индекс с числовым значением на счетчик (чтобы записи добавлялись автоматически). Это надо реализовать в виде патча, т. е отдельной программы.
Как это можно сделать? Есть ли примеры? Я не нашел ни одного.
Есть ли хитрый SQL запрос, который решит данную проблему?
Если нет такого запроса, как это можно сделать иначе?
С уважением, Леонид
Re[2]: Есть специалисты по базам данных на этом форуме?!
Здравствуйте, alico, Вы писали:
A>Боюсь, что на вопрос, поставленный в такой форме Вы ответа не получите
A>Максимум, что Вы узнаете — это что аксесс не является базой данных и все такое
Тему назвал так, только потому что на тему которую оставлял до этой темы, я не получил вообще ответа в течение 2 дней. Так что решил, как-то заинтересовать людей , надеюсь, никого не обидел
Re: Есть специалисты по базам данных на этом форуме?!
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Leonid_CSIT, Вы писали:
L_C>>Здравствуйте!
L_C>>Если ты специалист, то ты сможешь ответить на этот вопрос!
L>Навеяло. L>
Есди ты не лох — отправь смс с текстом "не лох" на номер 7755. чем больше смс отправишь — тем больше не лох!
Никого не хотел обидеть, надо было как-то заинтересовать. В этом теме хоть ответы есть, уже благодарен!!! Но хотелось бы по существу все-таки.
Re: Есть специалисты по базам данных на этом форуме?!
Здравствуйте, Leonid_CSIT, Вы писали:
L_C>Здравствуйте!
L_C>Если ты специалист, то ты сможешь ответить на этот вопрос!
L_C>Есть база данных Access с таблицами и связями. Необходимо программно поменять ключевой поле с типа числового на счетчик с сохранением последовательности, которая была в числовом поле. Данная таблица связана с другой таблицей.
L_C>С базами данных почти не работаю, поэтому у меня такой порядок действия по такой проблеме: L_C>1. прочитать все таблицу в память L_C>2. удалить связь с другой таблицей L_C>3. удалить таблицу L_C>4. создать таблицу с другими параметрами L_C>5. записать в таблицу старые данные, учитывая последовательность L_C>Застрял на 2 пункте. L_C>Работаю через ADO на VС++. Могу получить через adSchemaTableConstraints собственно CONSTRAINT таблицы, в которой необходимо удалить связь. У меня это оказывается PrimaryKey. Удалить его таким запросом: L_C>
L_C>ALTER TABLE <имя таблицы> DROP CONSTRAINT PRIMARYKEY
L_C>
L_C>не получается. Говорит, что он используется.
Естественно, используется, если есть внешние ключи, которые на него ссылаются. Поэтому сначала для всех таблиц, содержащих данный ключ, как внешний пишем:
ALTER TABLE <имя_таблицы_которая_ссылается_на_ту_что_содержит_числ_поле!> DROP CONSTRAINT <название_этого_самого_ограничителя>
и после того, как не останется ни одной ссылки, дропаем сам первичный ключ.
Поймите, что внешний ключ относится к не к той же таблице, что содержит первичный ключ, а к той, что ссылается на него. Поэтому и нет конструкции для удаления внешнего ключа.