【发布时间】:2018-12-07 10:58:59
【问题描述】:
我正在尝试将一些条目插入到我的表中,并且当条目已经存在时什么也不做。我的主键包含多个列(event_timestamp、device_id、path、message_id)。
当我在 JDBC 中尝试以下语句时:
MERGE INTO events dest
USING ( SELECT event_timestamp, device_id, path, message_id from events) src
ON (dest.event_timestamp = src.event_timestamp
and dest.device_id = src.device_id
and dest.path = src.path
and dest.message_id = src.message_id)
WHEN NOT MATCHED THEN
INSERT (event_timestamp, device_id, path, message_id, text, direction, speed, net, gross)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
没有插入任何内容。
使用正常的语句,例如:
INSERT (event_timestamp, device_id, path, message_id, text, direction, speed, net, gross) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
一切都插入没有问题。
我还尝试将 select 语句更改为从 DUAL 中选择,而不是像这样的事件:
MERGE INTO events dest
"USING ( SELECT event_timestamp, device_id, path, message_id from DUAL) src
ON (dest.event_timestamp = src.event_timestamp
and dest.device_id = src.device_id
and dest.path = src.path
and dest.message_id = src.message_id)
WHEN NOT MATCHED THEN
INSERT (event_timestamp, device_id, path, message_id, text, direction, speed, net, gross)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
但后来我得到了异常:ORA-00904: invalid identifier
我该怎么做才能让它发挥作用?
【问题讨论】:
-
WHEN MATCHED THEN试试UPDATE,这将确保匹配的记录存在与否 -
event_timestamp是日期还是时间戳列?如果是这样,请确保插入唯一的记录。 -
@Jåcob:感谢您的评论。当我尝试对任何引用的列
ORA-38104: Columns referenced in the ON Clause cannot be updated进行更新时,出现以下异常。event_timestamp是一个时间戳列。我试图通过检查复合(event_timestamp、device_id、path、message_id)来确保插入唯一记录。 -
如果您发布“普通”SQL而不是Java中的字符串连接,那么您的SQL会更容易理解