AS400 - 使用 Merge 将新记录添加到 table 并防止重复键错误

AS400 - Using Merge to add a new record to a table and prevent from a duplicate key error

我创建了一个新的 table VISNHDR,其中包含以下字段(它不是整个 table 但这足以解决我的问题):

 - ORDNO    (VARCHAR 7) - KEY
 - ORDDT    (NUMERIC 7,0) - KEY
 - ORDTM    (NUMERIC 6,0) - KEY
 - CRTDT    (NUMERIC 7,0)
 - CRTTM    (NUMERIC 6,0)

我正在尝试 INSERT 对此 table 的新记录,并且我正试图在 duplicate key 的情况下阻止它的插入。 我更喜欢在一个查询中执行此操作,而不是让一个查询检查是否存在重复,而另一个查询插入记录。 根据我在网上的研究,我尝试使用 MERGE 但没有成功。

MERGE INTO visnhdr v1 USING ( SELECT
    ordno,
    orddt,
    ordtm
   FROM
    visnhdr
    WHERE
    ordno = 'M12345'
    AND orddt = 1170101
    AND ordtm = 101010
) AS V2(ordno,orddt,ordtm)
ON (
    v1.ordno = v2.ordno
    AND v1.orddt = v2.orddt
    AND v1.ordtm = v2.ordtm
)
WHEN NOT MATCHED THEN INSERT (
    ordno,
    orddt,
    ordtm,
    crtdt,
    crttm
) VALUES (
    v2.ordno,
    v2.orddt,
    v2.ordtm,
    1170102,
    101011
);

我收到一个错误:

Row not found for MERGE.

解决我的问题的正确语法是什么?

我找到了正确的语法:

MERGE INTO VISNHDR V1 USING (
      VALUES ('M12345', 1170101, 101011, 1170103, 101012)) V2 (ORDNO, ORDDT, ORDTM, CRDDT, CRTTM)
      ON V1.ORDNO = V2.ORDNO AND V1.ORDDT = V2.ORDDT AND V1.ORDTM = V2.ORDTM
WHEN NOT MATCHED THEN
      INSERT VALUES(V2.ORDNO, V2.ORDDT, V2.ORDTM, V2.CRDDT, V2.CRTTM)

评论:

根据您定义列的方式,您可能会收到一条错误消息:

one or more of the columns omited from the column list was created as not null.

这是我遇到的错误,我需要将 table 中的其他字段添加到查询中。这与我在 post.

中遇到的语法问题无关