2

嗨,我在 Postgres 中有一张桌子,比如 email_messages。它是分区的,所以无论我使用我的 java 应用程序执行的插入操作都不会影响主表,因为数据实际上是插入到子表中的。这是问题所在,我想获得一个自动生成的列值(比如 email_message_id 是大序列类型的)。Postgres 将它作为 null 返回,因为没有在主表上进行插入。对于 oracle,我使用 GeneratedKeyHolder 来获取该值。但是我不能对 postgres 中的分区表做同样的事情。请帮帮我。

这是我们用于 oracle 的代码片段

public void createAndFetchPKImpl(final Entity pEntity,
  final String pStatementId, final String pPKColumnName) {


final SqlParameterSource parameterSource =
  new BeanPropertySqlParameterSource(pEntity);

  final String[] columnNames = new String[]{"email_message_id"};
  final KeyHolder keyHolder = new GeneratedKeyHolder();
  final int numberOfRowsEffected = mNamedParameterJdbcTemplate.update(
      getStatement(pStatementId), parameterSource, keyHolder, columnNames);
  pEntity.setId(ConversionUtil.getLongValue(keyHolder.getKey()));

}
4

1 回答 1

2

当您在 PostgreSQL 中使用基于触发器的分区时,JDBC 驱动程序报告零行受到影响/插入是正常的。这是因为原来的 SQL或者实际上并没有生效,主表上没有任何行发生变化UPDATE。而是在一个或多个子表上执行操作。INSERTDELETE

基本上,PostgreSQL 中的分区有点像 hack,这是它更明显的限制之一。

解决方法是:

  • INSERT//直接针对子表UPDATEDELETE而不是顶级表;
  • 忽略结果行数;或者
  • 使用RULEs 而INSERT ... RETURNING代替(但它们有自己的问题)(不适用于分区)
于 2013-04-02T08:54:01.747 回答