插入分区表时获取生成的键值

时间:2013-04-02 06:32:28

标签: java postgresql spring-jdbc

嗨,我在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()));

}

1 个答案:

答案 0 :(得分:2)

在PostgreSQL中使用基于触发器的分区时,JDBC驱动程序 normal 报告零行受影响/插入。这是因为原始SQL UPDATEINSERTDELETE实际上没有生效,主表上没有更改行。而是在一个或多个子表上执行操作。

基本上,PostgreSQL中的分区有点像黑客,这是其中一个比较明显的局限性。

解决方法是:

  • INSERT / UPDATE / DELETE直接针对子表,而不是顶级表格;
  • 忽略结果rowcount;或
  • 使用RULEINSERT ... RETURNING代替(但他们有自己的问题)(不适用于分区)