복붙노트

[SQL] 에 Upserting MS 액세스

SQL

에 Upserting MS 액세스

나는 그것을하지 않는 경우 행이 존재하는 경우 갱신하지만, 삽입 그래서 MS-액세스 2000에 대한 SQL 쿼리를 작성해야합니다. (나는 이것이 "upsert"라고 생각)

행이 존재하는 경우 ...

UPDATE Table1 SET (...) WHERE Column1='SomeValue'

그것은 존재하지 않는 경우 ...

INSERT INTO Table1 VALUES (...)

이것은 하나 개의 쿼리에서 수행 할 수 있습니까?

해결법

  1. ==============================

    1.나는 보통 먼저 삽입 문을 실행 한 다음 나는 오류 (3022)가 행이 이미 존재 나타냅니다 발생 있는지 확인하십시오. 이 같은 그래서 :

    나는 보통 먼저 삽입 문을 실행 한 다음 나는 오류 (3022)가 행이 이미 존재 나타냅니다 발생 있는지 확인하십시오. 이 같은 그래서 :

    On Error Resume Next
    CurrentDb.Execute "INSERT INTO Table1 (Fields) VALUES (Data)", dbFailOnError
    If Err.Number = 3022 Then
        Err.Clear        
        CurrentDb.Execute "UPDATE Table1 SET (Fields = Values) WHERE Column1 = 'SomeValue'", dbFailOnError
    ElseIf Err.Number <> 0 Then
        'Handle the error here
        Err.Clear
    End If
    

    EDIT1 : 나는 내가 여기에 게시 한 것은 매우 일반적인 해결책이 언급하고 싶지만 다른 방법이 특히 오류를 계획하고 일반적으로 간주됩니다 프로그램의 정상적인 흐름의 한 부분으로 나쁜 생각을을 사용하여 알고 있어야합니다 동일한 결과를 성취. 이 문제를 지적 RolandTumble 감사합니다.

  2. ==============================

    2.당신은 가입 왼쪽과 UPDATE 쿼리를 사용하여 Access에서 upsert을 시뮬레이션 할 수 있습니다.

    당신은 가입 왼쪽과 UPDATE 쿼리를 사용하여 Access에서 upsert을 시뮬레이션 할 수 있습니다.

    update b
    left join a on b.id=a.id
    set a.f1=b.f1
    , a.f2=b.f2
    , a.f3=b.f3
    

    참조 : https://www.experts-exchange.com/questions/28713136/Can-I-use-the-SQL-MERGE-statement-in-a-query-in-Access-2010.html

  3. ==============================

    3.테이블이 고유 키가있는 경우에 "upsert"는 가능하다.

    테이블이 고유 키가있는 경우에 "upsert"는 가능하다.

    스마트 액세스에서이 오래된 팁 내 즐겨 찾기 중 하나입니다 :

  4. ==============================

    4.열 1에 고유 인덱스를 가정 할 때, 당신은 당신이 열 1 = 'someValue와'로 0 또는 1 행이 있는지 여부를 확인하기 위해 DCOUNT 식을 사용할 수 있습니다. 그런 다음 INSERT 또는 UPDATE는 그 수를 기준으로합니다.

    열 1에 고유 인덱스를 가정 할 때, 당신은 당신이 열 1 = 'someValue와'로 0 또는 1 행이 있는지 여부를 확인하기 위해 DCOUNT 식을 사용할 수 있습니다. 그런 다음 INSERT 또는 UPDATE는 그 수를 기준으로합니다.

    If DCount("*", "Table1", "Column1 = 'SomeValue'") = 0 Then
        Debug.Print "do INSERT"
    Else
        Debug.Print "do UPDATE"
    End If
    

    내가 먼저, INSERT를 시도하는 3022 키 위반 오류를 트래핑 및 오류에 대한 응답으로 UPDATE 일에이 방법을 선호합니다. 그러나 나는 나의 접근 방식에서 큰 이익을 주장 할 수 없습니다. 테이블이 일련 번호 필드를 포함하는 경우, 실패한 INSERT를 피하는 것은 불필요 다음 일련 번호 값을 늘리지에서 당신을 막을 것이다. 필요하지 않을 때 나는 또한 INSERT 문자열을 구축 피할 수 있습니다. 액세스 요리 책 나는 그들이 실제로 필요하지 않는 한 기회는 문자열을 구축 피하기 위해 찾을 수 있도록 문자열 연결은, VBA에서 적당히 비용이 많이 드는 작업이다 내게 말했다. 이러한 접근 방식은 또한 불필요한 INSERT에 대한 잠금을 만들지 않도록합니다.

    그러나, 그 이유는 아무도 당신을 위해 매우 강력한하지 않을 수 있습니다. 그리고 모든 정직에서 나는이 경우 내 취향이 나에게 "잘 느낀다"일에 대해있을 수 있습니다 생각합니다. 즉, 첫 번째에서 일어나는에서 오류를 방지 - 당신이 이미 존재 APPEND 값을 시도하지 않도록 그것은 당신의 SQL을 작성하는 것이 좋습니다 "나는 이전 스택 오버플로 질문에 데이비드-W-펜톤 @으로이 의견에 동의 오히려 자신에서 당신을 저장하는 데이터베이스 엔진에 따라보다 놓습니다. "

  5. ==============================

    5.당신은 오류를 잡을 필요가 없습니다. 대신에, 단지 확인 후 INSERT 문을 실행하고

    당신은 오류를 잡을 필요가 없습니다. 대신에, 단지 확인 후 INSERT 문을 실행하고

    CurrentDb.RecordsAffected
    

    그것은 1 또는 0, 따라 할 것이다.

    참고 :이 CurrentDB에 대해 실행할 수있는 좋은 방법이 아니다. 더 나은 로컬 변수에 데이터베이스를 캡처 :

    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute(INSERT...)
    If db.RecordsAffected = 0 Then
      db.Execute(UPDATE...)
    End If
    
  6. from https://stackoverflow.com/questions/6199417/upserting-in-ms-access by cc-by-sa and MIT license