Does DB2 have an "insert or update" statement? Does DB2 have an "insert or update" statement? sql sql

Does DB2 have an "insert or update" statement?


I found this thread because I really needed a one-liner for DB2 INSERT OR UPDATE.

The following syntax seems to work, without requiring a separate temp table.

It works by using VALUES() to create a table structure . The SELECT * seems surplus IMHO but without it I get syntax errors.

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.valWHEN NOT MATCHED THEN    INSERT (id, val) VALUES (vt.id, vt.val);

if you have to insert more than one row, the VALUES part can be repeated without having to duplicate the rest.

VALUES     (123, 'text'),    (456, 'more')

The result is a single statement that can INSERT OR UPDATE one or many rows presumably as an atomic operation.


This response is to hopefully fully answer the query MrSimpleMind had in use-update-and-insert-in-same-query and to provide a working simple example of the DB2 MERGE statement with a scenario of inserting AND updating in one go (record with ID 2 is updated and record ID 3 inserted).

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.DUALUNION 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;