2012-02-22 3 views
2

부모 테이블과 다른 82 개의 테이블에 기본 키가있는 MS Access DB가 있습니다. 새로운 데이터는 새로운 이름으로 올 것 기본 키Access 데이터베이스에서 기본 키 값의 이름을 바꾸는 방법

Before  New 
RS182  X182RS 
RS188  X188RS 
RD301  X301RD 

나는에 대한 이전의 모든 기록 데이터를 연결할 때문에 DB의 모든 테이블에 대량의 기본 키 값의 이름을 바꿀 수있는 방법이 있나요 새로운 이름 값.

답변

1

내가 당신의 질문에서 다음과 같은 올바른 이해 적어도 경우, 코드가 어렵지 않다 :

기본 키 열이 모든 테이블
  • 에 존재
    • 이있는 모든 테이블에서 같은 이름 (I 당신의 모든 테이블의 목록을 얻으려면> 두 글자와 세 개의 숫자)

    를 - '

  • 기존의 값이 모두 같은 형식 ("RS182"에) 내 예제에서 ID을 사용하는 것이다 r 데이터베이스를 찾으려면 hidden table MSysObjects을 살펴보십시오.

    그리고 나서 테이블을 반복하고 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 
    
  • +0

    SetWarnings off == 매우 나쁨! – HansUp

    +0

    @HansUp : 전에는 생각 해보지 않았습니다. 그냥 봤는데 [this] (http://www.granite.ab.ca/access/bestpractices.htm)였습니다. 이것이 유일한 이유입니까 아니면 더 많은 것이 있습니까? –

    +0

    나는 그 페이지에서 Tony가 말한 것에 강력히 동의한다. 나는 SetWarnings을 끄는 것이 단순히 정보를 억압하기 때문에 나쁜 것이라고 덧붙일 것이다. SetWarnings을 끄는 것이 효율적인 문제 해결에 큰 장애물이었던이 스택 오버플로 문제를 고려하십시오. http://stackoverflow.com/questions/7115247/does-ms-access-suppress-primary-key-violations-on-inserts – HansUp

    1

    , 새로운 오래된 기본 키 값 사이의 일관된 패턴이 보인다.

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

    그렇다면 일련의 UPDATE 문을 사용하여 이전 값을 새 것으로 바꿉니다. 그러나 먼저 보관을 위해 데이터베이스의 백업 사본을 만드십시오. 예를 들어

    , YourTable에 대한 기본 키 필드의 이름은 경우 ID :

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

    YourTable가 정의 된 관계에 포함되어있는 경우, 먼저 "강제 그 관계를 드롭 (또는 적어도 선택을 취소해야합니다 참조 무결성 "옵션), 기본 키 값을 갱신 한 후 관계를 복원하십시오.

    또한 ID에서 기본 키 속성을 제거하면 UPDATE를 더 빨리 완료 할 수 있습니다. 이후에 기본 키를 다시 할당하십시오.

    이 변환이 필요한 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

    다른 테이블에 관련된 레코드가있는 경우 PK를 수정할 수 없습니다.
    그래서 여기있는 속임수는 모든 관계를 일시적으로 수정하는 것입니다 (존재한다고 가정하고 참조 무결성을 사용하도록 설정해야합니다. 그렇지 않으면 대화 할 필요가 없을 것입니다 :). 계단식 업데이트 옵션을 사용합니다.
    데이터가 다시 돌아 오면 그 옵션을 끄는 것을 잊지 마세요 !!

    관련 문제