[SQL] 에 Upserting MS 액세스
SQL에 Upserting MS 액세스
나는 그것을하지 않는 경우 행이 존재하는 경우 갱신하지만, 삽입 그래서 MS-액세스 2000에 대한 SQL 쿼리를 작성해야합니다. (나는 이것이 "upsert"라고 생각)
즉
행이 존재하는 경우 ...
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
그것은 존재하지 않는 경우 ...
INSERT INTO Table1 VALUES (...)
이것은 하나 개의 쿼리에서 수행 할 수 있습니까?
해결법
-
==============================
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.당신은 가입 왼쪽과 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.테이블이 고유 키가있는 경우에 "upsert"는 가능하다.
테이블이 고유 키가있는 경우에 "upsert"는 가능하다.
스마트 액세스에서이 오래된 팁 내 즐겨 찾기 중 하나입니다 :
-
==============================
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.당신은 오류를 잡을 필요가 없습니다. 대신에, 단지 확인 후 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
from https://stackoverflow.com/questions/6199417/upserting-in-ms-access by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server는 자기가 가입 재귀 (0) | 2020.03.17 |
---|---|
[SQL] MySQL과 PostgreSQL을에 절, PostgreSQL을에 왜 오류에 의해 그룹? (0) | 2020.03.17 |
[SQL] 어떻게 SQL Server 메모리 깨끗 SqlDependency합니까? (0) | 2020.03.17 |
[SQL] 가변 크기 변수 목록과 MySQL의 문 준비 (0) | 2020.03.17 |
[SQL] MySQL의에서 GROUP_CONCAT 유사한 오라클의 모든 기능이 있습니까? [복제] (0) | 2020.03.17 |