使用 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

使用 JDBC 连接到 PostgreSql 的本地实例

PostgreSQL jdbc dirver 版本号从9到42原因

使用 JDBC 连接到 PostgreSQL 数据库时选择角色

为啥 Wildfly 10 在部署时给我“jdbc:postgresql 不允许空名称段”?

使用 JDBC 插入 PostgreSQL 时间类型时出错