我需要将数据从一个表合并到另一个表。
数据通过平面文件传递。这就是为什么我在将其投入生产之前首先使用负载表的原因。
我向加载表添加了一个字段loadtabletime
,因此我可以告诉 db2 一次只合并一个文件,即使一次在加载表中插入了多个文件。
负荷表是loaddlp.reservation_insert
,生产表是dlp.reservation
。
这是我的查询:
MERGE INTO DLP.RESERVATION AS E
USING LOADDLP.RESERVATION_INSERT as et
on e.TICKET_SERVER = et.TICKET_SERVER
and e.RES_ID = et.RES_ID
and et.LOADTABLETIME = '2012-06-09 10:44:17.42236'
WHEN MATCHED THEN UPDATE SET (foo) = (bar)
WHEN NOT MATCHED THEN INSERT (xyz) VALUES (;akdjf)
加载表的主键是ticket_server
,res_id
和loadtabletime
; 对于 prod 表,它是ticket_server
and res_id
。
此查询失败并出现以下错误:
无法将阶段中的数据更新到生产表 RESERVATION。[[23505] [IBM][CLI Driver][DB2/LINUXX8664] SQL0803N INSERT 语句、UPDATE 语句或由 DELETE 语句引起的外键更新中的一个或多个值无效,因为主键、唯一约束或唯一由“1”标识的索引限制表“DLP.RESERVATION”具有索引键的重复值。SQLSTATE=23505
但是,当我loadtabletime
从where
子句中删除时,它会神奇地起作用。当然,这不是一个选项,因为当将多个文件加载到加载表中时,插入时可能会出现 pk 违规。
当我运行时:
SELECT count(*)
from loaddlp.reservation_insert
where LOADTABLETIME = '2012-06-09 10:44:17.42236';
我得到正确的结果。
有谁知道查询有什么问题?