복붙노트

[SQL] 합니까 DB2는 "삽입 또는 업데이트"문이?

SQL

합니까 DB2는 "삽입 또는 업데이트"문이?

내 코드 (자바)에서 나는 내 코드가 실행 된 후 행이 데이터베이스 (DB2)에 있는지 확인합니다.

내 코드는 이제 선택 않으며, 어떤 결과가 반환되지 않는 경우는 삽입을한다. 멀티 스레드 환경에서 실행 때 동시성 문제에 저를 노출하기 때문에 난 정말이 코드를 좋아하지 않는다.

내가 뭘하고 싶은 DB2에서 대신 내 자바 코드에서이 논리를 넣어하는 것입니다. 합니까 DB2는 삽입 또는 업데이트 문이? 아니면 이런 건 내가 사용할 수있는?

예를 들면 :

insertupdate into mytable values ('myid')

그 일을하는 또 다른 방법은 아마 항상 삽입 및 캐치 "SQL 코드 -803 기본 키가 이미 존재"를 수행하는 것입니다,하지만 난 가능하면 피하기 싶습니다.

해결법

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

    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. ==============================

    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. ==============================

    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. ==============================

    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에서 실행되는 것입니다.

  5. from https://stackoverflow.com/questions/330241/does-db2-have-an-insert-or-update-statement by cc-by-sa and MIT license