[SQL] 합니까 DB2는 "삽입 또는 업데이트"문이?
SQL합니까 DB2는 "삽입 또는 업데이트"문이?
내 코드 (자바)에서 나는 내 코드가 실행 된 후 행이 데이터베이스 (DB2)에 있는지 확인합니다.
내 코드는 이제 선택 않으며, 어떤 결과가 반환되지 않는 경우는 삽입을한다. 멀티 스레드 환경에서 실행 때 동시성 문제에 저를 노출하기 때문에 난 정말이 코드를 좋아하지 않는다.
내가 뭘하고 싶은 DB2에서 대신 내 자바 코드에서이 논리를 넣어하는 것입니다. 합니까 DB2는 삽입 또는 업데이트 문이? 아니면 이런 건 내가 사용할 수있는?
예를 들면 :
insertupdate into mytable values ('myid')
그 일을하는 또 다른 방법은 아마 항상 삽입 및 캐치 "SQL 코드 -803 기본 키가 이미 존재"를 수행하는 것입니다,하지만 난 가능하면 피하기 싶습니다.
해결법
-
==============================
1.예, DB2는 UPSERT (갱신 또는 삽입) 할 것 MERGE 문을 가지고 있습니다.
예, DB2는 UPSERT (갱신 또는 삽입) 할 것 MERGE 문을 가지고 있습니다.
MERGE INTO target_table USING source_table ON match-condition {WHEN [NOT] MATCHED THEN [UPDATE SET ...|DELETE|INSERT VALUES ....|SIGNAL ...]} [ELSE IGNORE]
보다:
http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/r0010873.htm
https://www.ibm.com/support/knowledgecenter/en/SS6NHC/com.ibm.swg.im.dashdb.sql.ref.doc/doc/r0010873.html
https://www.ibm.com/developerworks/community/blogs/SQLTips4DB2LUW/entry/merge?lang=en
-
==============================
2.내가 정말 DB2 INSERT 또는 UPDATE에 대한 한 줄을 필요로했기 때문에 나는이 스레드를 발견했다.
내가 정말 DB2 INSERT 또는 UPDATE에 대한 한 줄을 필요로했기 때문에 나는이 스레드를 발견했다.
다음 구문은 별도의 임시 테이블을 필요로하지 않고, 작동하는 것 같다.
그것은 테이블 구조를 만드는 () 값을 사용하여 작동합니다. 선택은 * 잉여 이럴을 보이지만없이 나는 구문 오류를 얻을.
MERGE INTO mytable AS mt USING ( SELECT * FROM TABLE ( VALUES (123, 'text') ) ) AS vt(id, val) ON (mt.id = vt.id) WHEN MATCHED THEN UPDATE SET val = vt.val WHEN NOT MATCHED THEN INSERT (id, val) VALUES (vt.id, vt.val) ;
하나 개 이상의 행을 삽입해야하는 경우, 값 부분은 나머지를 복제 할 필요없이 반복 할 수 있습니다.
VALUES (123, 'text'), (456, 'more')
결과는 원자 작업으로 아마도 UPDATE의 하나 또는 여러 행 또는 삽입 할 수 있습니다 하나의 문입니다.
-
==============================
3.이 응답은 희망이 완전히와 MrSimpleMind가 사용하기 업데이트 - 및 - 삽입 - - 동일 쿼리와 한 번에 삽입 및 업데이트의 시나리오와 DB2의 MERGE 문의 작업을 간단한 예제를 제공 할 수 있었다 쿼리 (기록에 대답하는 것입니다 ) ID 2 업데이트되며, 레코드 ID (3)을 삽입 하였다.
이 응답은 희망이 완전히와 MrSimpleMind가 사용하기 업데이트 - 및 - 삽입 - - 동일 쿼리와 한 번에 삽입 및 업데이트의 시나리오와 DB2의 MERGE 문의 작업을 간단한 예제를 제공 할 수 있었다 쿼리 (기록에 대답하는 것입니다 ) ID 2 업데이트되며, 레코드 ID (3)을 삽입 하였다.
CREATE TABLE STAGE.TEST_TAB ( ID INTEGER, DATE DATE, STATUS VARCHAR(10) ); COMMIT; INSERT INTO TEST_TAB VALUES (1, '2013-04-14', NULL), (2, '2013-04-15', NULL); COMMIT; MERGE INTO TEST_TAB T USING ( SELECT 3 NEW_ID, CURRENT_DATE NEW_DATE, 'NEW' NEW_STATUS FROM SYSIBM.DUAL UNION ALL SELECT 2 NEW_ID, NULL NEW_DATE, 'OLD' NEW_STATUS FROM SYSIBM.DUAL ) AS S ON S.NEW_ID = T.ID WHEN MATCHED THEN UPDATE SET (T.STATUS) = (S.NEW_STATUS) WHEN NOT MATCHED THEN INSERT (T.ID, T.DATE, T.STATUS) VALUES (S.NEW_ID, S.NEW_DATE, S.NEW_STATUS); COMMIT;
-
==============================
4.또 다른 방법은이 두 쿼리를 실행하는 것입니다. 그것은 MERGE 문을 만드는 것보다 간단합니다 :
또 다른 방법은이 두 쿼리를 실행하는 것입니다. 그것은 MERGE 문을 만드는 것보다 간단합니다 :
update TABLE_NAME set FIELD_NAME=xxxxx where MyID=XXX; INSERT INTO TABLE_NAME values (MyField1,MyField2) WHERE NOT EXISTS(select 1 from TABLE_NAME where MyId=xxxx);
MYID가있는 경우 첫 번째 쿼리는, 당신이 필요로하는 필드를 업데이트합니다. DB에 두 번째 삽입 행이 MYID가 존재하지 않는 경우.
결과는 쿼리 하나가 당신의 DB에서 실행되는 것입니다.
from https://stackoverflow.com/questions/330241/does-db2-have-an-insert-or-update-statement by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버에서 변수로 저장 프로 시저의 출력을 반환하는 방법 (0) | 2020.04.25 |
---|---|
[SQL] PHP의 PDO 연 마 SQL 연결을 폐쇄해야 (0) | 2020.04.25 |
[SQL] 어떻게 PostgreSQL의 일시적 기능을 만드는 방법? (0) | 2020.04.24 |
[SQL] 왜 사용을 선택 최고 100 %? (0) | 2020.04.24 |
[SQL] 이메일에 대한 HTML 테이블에 SQL 쿼리 결과 테이블로 변환 (0) | 2020.04.24 |