DB2:插入新行并忽略重复行

nbewdwxp  于 2023-01-30  发布在  DB2
关注(0)|答案(4)|浏览(239)

我需要在表中插入大约100行-其中一些行之前已经插入,另一些行尚未插入
这是我的插入,如果主键不存在,它可以正常工作。我将运行这个100次,每次使用不同的值。但是,如果主键存在,它将失败,并停止以后的命令运行。
如何忽略失败并继续前进,还是简单地忽略重复?

INSERT  INTO  MY_TABLE 
   VALUES( 12342, 'fdbvdfb', 'svsdv', '5019 teR','' , 'saa', 'AL',35005 , 'C', 37, '0',368 , 'P', '2023-02-13', '2023-01-01', '2023-01-10', '2023-01-20','' , 'Test', 'Test', 'Test', 'JFK', '', null, 'Y', 'Y', '', '', '', '', '', '',2385 ,2 , '', 'N', '2023-01-16', '2023-01-20', '', NULL,NULL, NULL, NULL, 'Y', 'Test', 'Test', '', 'N', 'Test', '')

这是错误:

SQL0803N One or more values in the INSERT statement, UPDATE statement, or foreign key update caused by a DELETE statement are not valid because the primary key, unique constraint or unique index identified by "XPS01ME1" constrains

将IGNORE插入投掷:

The use of the reserved word "IGNORE" following "" is not valid.

如果有帮助,我使用的是WinSQL 10.0.157.697

h5qlskok

h5qlskok1#

您没有提到Db2的平台和版本,所以我将向您介绍MERGE statement的Linux/Unix/Windows(LUW)文档...
因为我不知道表名或列名,所以我只给予您一个使用伪名称的示例。

merge into MYTABLE as tgt
using (select * 
        from table( values(1,1,'CMW',5,1)
                  ) tmp ( tblKey, fld1, fld2, fld3, fld4)
      ) as src
on src.tblKey = tgt.tblekey
when not matched then 
   insert ( tblKey, fld1, fld2, fld3, fld4)
     values ( src.tblKey, src.fld1, src.fld2, src.fld3, src.fld4);

您基本上是在一行的运行中构建临时表
table( values(1,1,'CMW',5,1) ) tmp ( tblKey, fld1, fld2, fld3, fld4)
然后,如果通过on src.tblKey = tgt.tblekey没有匹配的记录,则执行插入。
请注意,虽然您可以这样做100次,但一次处理所有100行是性能更好的解决方案。

merge into MYTABLE as tgt
using (select * 
        from table( values (1,1,'CMW1',5,1)
                          , (2,11,'CMW2',50,11)
                          , (3,21,'CMW3',8,21)
                         -- , <more rows here>
                  ) tmp ( tblKey, fld1, fld2, fld3, fld4)
      ) as src
on src.tblKey = tgt.tblekey
when not matched then 
   insert ( tblKey, fld1, fld2, fld3, fld4)
     values ( src.tblKey, src.fld1, src.fld2, src.fld3, src.fld4);

或者,您可以创建一个实际的临时表,插入100行(最好是在一次插入中),然后使用MERGE

20jt8wwn

20jt8wwn2#

你可以用如下的复合语句来完成:

--#SET TERMINATOR @
CREATE TABLE MY_TABLE (ID INT NOT NULL PRIMARY KEY)@

BEGIN
  DECLARE CONTINUE HANDLER FOR SQLSTATE '23505' BEGIN END;
  INSERT INTO MY_TABLE (ID) VALUES (1);
END@

BEGIN
  DECLARE CONTINUE HANDLER FOR SQLSTATE '23505' BEGIN END;
  INSERT INTO MY_TABLE (ID) VALUES (1), (2), (3);
END@

BEGIN
  DECLARE CONTINUE HANDLER FOR SQLSTATE '23505' BEGIN END;
  INSERT INTO MY_TABLE (ID) VALUES (4);
END@

SELECT * FROM MY_TABLE@

| 识别号|
| - ------|
| 1个|
| 四个|
fiddle

tgabmvqs

tgabmvqs3#

您必须在INSERT查询中提到列名和值,如下所示:

INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)
    VALUES ('John', 'John Erichsen', '21 park st', 'Boston', '02490', 'USA');

在上面的Customers表中,CustomerId字段是主键自动递增。我们不需要为此插入值。
请尽量让我们知道。

yvt65v4c

yvt65v4c4#

这就是如何忽略db2中的错误--

  • 注意,这不是您的问题的正确sqlstate--请替换为您需要的sqlstate *
DECLARE CONTINUE HANDLER FOR SQLSTATE '23505'         
   BEGIN  -- ignore error for duplicate value 
   END;

此处记录https://www.ibm.com/docs/en/db2-for-zos/12?topic=procedure-ignoring-condition-in-sql

相关问题