使用 Postgresql JDBC 时,将导致插入 0 行的 INSERT 语句
Posted
技术标签:
【中文标题】使用 Postgresql JDBC 时,将导致插入 0 行的 INSERT 语句【英文标题】:When Using Postgresql JDBC, INSERT statement that will result in 0 rows being inserted 【发布时间】:2017-08-24 01:34:52 【问题描述】:使用 Postgresql JDBC 时,使用 executeUpdate 语句插入行但结果为零。我发现数据被插入了。 API 文档告诉 executeUpdate 方法返回受影响的行数。
mSqlInsertEventHist = "INSERT INTO " + DatabaseTables.EVENT_HIST +
" ( event_id, mntr_id, mntr_zone, mntr_name, mntr_class_name, mntr_class_sub_type, host_name, ip_addr, " +
" metric_id, metric_name, perf_name, object_name, event_type, event_master_id, " +
" event_name, event_level, event_msg, threshold, event_recv_day, event_reco_dt, event_recv_dt," +
" event_saved_dt, blackout_yn, msg_filter_yn ) " +
" VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " + " now() " + ", ?, ? ) ";
mPstmtInstEvtHist.setLong(1, eventid);
mPstmtInstEvtHist.setInt(2, mntrid);
mPstmtInstEvtHist.setString(3, mntrZone);
mPstmtInstEvtHist.setString(4, mntrname);
mPstmtInstEvtHist.setString(5, mntrClsName);
mPstmtInstEvtHist.setString(6, mntrClsSubType);
mPstmtInstEvtHist.setString(7, hostname);
mPstmtInstEvtHist.setString(8, ipAddr);
mPstmtInstEvtHist.setInt(9, Integer.parseInt((String)dataobj.get(MQConstants.METRIC_ID)));
mPstmtInstEvtHist.setString(10, metricname);
mPstmtInstEvtHist.setString(11, perfname);
mPstmtInstEvtHist.setString(12, objectname);
mPstmtInstEvtHist.setString(13, dataType);
mPstmtInstEvtHist.setInt(14,
Integer.parseInt((String)dataobj.get(MQConstants.EVENT_MASTER_ID)));
mPstmtInstEvtHist.setString(15, eventname);
mPstmtInstEvtHist.setString(16, eventlvl);
mPstmtInstEvtHist.setString(17, evtMsg);
mPstmtInstEvtHist.setObject(18, jsonObj);
mPstmtInstEvtHist.setInt(19,
Integer.parseInt((String)dataobj.get(MQConstants.EVENT_RECV_DAY)));
mPstmtInstEvtHist.setTimestamp(20, colTs);
mPstmtInstEvtHist.setTimestamp(21, rcvTs);
mPstmtInstEvtHist.setString(22,
(String)dataobj.get(MQConstants.BLACKOUT_YN));
mPstmtInstEvtHist.setString(23,
(String)dataobj.get(MQConstants.MSG_FILTER_YN));
rtn = mPstmtInstEvtHist.executeUpdate();
if ( rtn == 1 ) //NOPMD
Debug.getLogger().trace("Inserted Event into => , , "
,DatabaseTables.EVENT_HIST , mntrid, eventname, eventlvl);
else
Debug.getLogger().warn("Failed to insert Event into => ",
DatabaseTables.EVENT_HIST, Debug.getString(jobj));
【问题讨论】:
我不知道你在问什么。请向我们展示一些代码和数据来解释正在发生的事情。 行被插入但总是记录 Debug.getLogger().warn("Failed to insert Event into => ", DatabaseTables.EVENT_HIST, Debug.getString(jobj));跨度> 实际的INSERT
声明在哪里?
添加了实际的 INSERT 语句
【参考方案1】:
您的数据库中可能有一个基于触发器的分区,如此处所述in PostgreSQL manual。
这完全发生在数据库端,除了它总是返回“0行插入”。
检查您的数据库架构以在 DatabaseTables.EVENT_HIST 表中分区触发器。
【讨论】:
感谢您的回答,EVENT_HIST 表中有分区触发器以上是关于使用 Postgresql JDBC 时,将导致插入 0 行的 INSERT 语句的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Postgresql 将 JDBC 连接到 sonarqube
PostgreSQL jdbc dirver 版本号从9到42原因
使用 JDBC 连接到 PostgreSQL 数据库时选择角色