嗨,我在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()));
}
答案 0 :(得分:2)
在PostgreSQL中使用基于触发器的分区时,JDBC驱动程序 normal 报告零行受影响/插入。这是因为原始SQL UPDATE
,INSERT
或DELETE
实际上没有生效,主表上没有更改行。而是在一个或多个子表上执行操作。
基本上,PostgreSQL中的分区有点像黑客,这是其中一个比较明显的局限性。
解决方法是:
INSERT
/ UPDATE
/ DELETE
直接针对子表,而不是顶级表格; RULE
和INSERT ... RETURNING
代替(但他们有自己的问题)