Как переименовать значение первичного ключа в БД Access - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть БД MS Access с первичным ключом родительской таблицы и 82 других таблиц. Новые данные будут поступать с новым именем для первичного ключа

Before      New
RS182       X182RS
RS188       X188RS
RD301       X301RD

Существует ли способ массового переименования значения первичного ключа во всех таблицах в БД, поскольку я хочу связать все предыдущие исторические данные с новым значением имени.

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Исходя из этого примера, кажется, что между новым и старым значениями первичного ключа существует согласованная закономерность.

? "X" & Right("RS182", 3) & Left("RS182", 2)
X182RS 

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

Например, если поле первичного ключа для YourTable имеет имя ID:

UPDATE YourTable
Set ID = "X" & Right(ID, 3) & Left(ID, 2);

Если YourTable включен в какие-либо определенные отношения, вам сначала нужно будет удалить эти отношения (или, по крайней мере, снять с них флажок «применять ссылочную целостность»), а затем восстановить отношения после обновления значений первичного ключа.

Кроме того, удаление свойства первичного ключа из идентификатора должно позволить выполнить обновление быстрее. Переназначить первичный ключ позже.

Поскольку у вас есть 82 таблицы, для которых требуется это преобразование, вы можете создать для этого процедуру VBA.

Public Sub ConvertPKeyValues(ByVal pTable As String, _
        ByVal pField As String)
    Dim db As DAO.Database
    Dim strSql As String
    strSql = "UPDATE [" & pTable & "]" & vbCrLf & _
        "Set [" & pField & "] = 'X' & " & _
        "Right([" & pField & "], 3) & " & _
        "Left([" & pField & "], 2);"
    Set db = CurrentDb
    db.Execute strSql, dbFailOnError
    Set db = Nothing
End Sub

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

1 голос
/ 23 февраля 2012

Вы не можете изменить PK, если у вас есть связанные записи в других таблицах.
Так что хитрость здесь заключается в том, чтобы временно изменить все эти отношения (я полагаю, они существуют и что ссылочная целостность включена - иначе я бы даже не сталпоговорим с вами :) и включите опцию Cascade Update.
Не забудьте отключить эту опцию, как только ваши данные вернутся в prod !!

1 голос
/ 23 февраля 2012

Это не так сложно, по крайней мере, если я понимаю следующее правильное из вашего вопроса:

  • столбец первичного ключа существует в каждой таблице
  • он имеет то же имяв каждой таблице (в моем примере я буду использовать ID)
  • все существующие значения имеют одинаковый формат ("RS182" -> две буквы и три цифры)

Чтобы получить список всех таблиц в вашей базе данных, вы можете взглянуть на скрытую таблицу 1013 *.

А затем вам просто нужно пройтись по таблицам и обновитьстолбец ID.
Быстрый пример (работает на моем компьютере):

Public Function Test()

    Dim RS As DAO.Recordset
    Dim SQL As String

    SQL = "select name from msysobjects where type = 1 and name not like 'msys*'"

    Set RS = CurrentDb.OpenRecordset(SQL)
    Do While Not RS.EOF

        SQL = "update " & RS("name") & " set ID = 'X' & Mid([ID],3) & Left([ID],2);"

        CurrentDb.Execute SQL, dbFailOnError

        RS.MoveNext
    Loop
    RS.Close
    Set RS = Nothing

End Function
...