我最近从 MySQL 切换到 PostgreSQL 作为项目的后端,并发现我的一些数据库代理方法需要审查。要插入链接对象,我使用事务来确保存储所有内容。我使用 jdbc 方法(例如setAutoCommit(false)
和)来执行此操作commit()
。我编写了一个实用方法,将记录插入表并返回生成的键。基本上我遵循了这里描述的技术2:
http://www.selikoff.net/2008/09/03/database-key-generation-in-java-applications/
自项目开始以来这一直有效,但在从 MySQL 迁移到 PostgreSQL 后getGeneratedKeys
返回新插入记录的所有列(请参阅下面的控制台输出)。
代码:
final ResultSet keys = ps.getGeneratedKeys();
final ResultSetMetaData metaData = keys.getMetaData();
for (int j = 0; j < metaData.getColumnCount(); j++) {
System.out.println("Col name: "+metaData.getColumnName(j+1));
}
输出:
Col name: pathstart
Col name: fk_id_c
Col name: xpathid
Col name: firstnodeisroot
表的数据库签名(从 pgAdmin III 自动生成的 SQL):
CREATE TABLE configuration.configuration_xpath
(
pathstart integer NOT NULL,
fk_id_c integer NOT NULL,
xpathid integer NOT NULL DEFAULT nextval('configuration.configuration_xpath_id_seq'::regclass),
firstnodeisroot boolean NOT NULL DEFAULT false,
CONSTRAINT configuration_xpath_pkey PRIMARY KEY (xpathid),
CONSTRAINT configuration_fk FOREIGN KEY (fk_id_c)
REFERENCES configuration.configuration (id_c) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
)
PK 背后序列的数据库签名:
CREATE SEQUENCE configuration.configuration_xpath_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 242
CACHE 1
OWNED BY configuration.configuration_xpath.xpathid;
所以问题是,为什么要getGeneratedKeys
返回所有列而不是只返回生成的键?我在这里搜索并找到了其他有类似问题的人:
http://www.postgresql.org/message-id/004801cb7518$cbc632e0$635298a0$@pravdin@disi.unitn.it
但是他们的问题没有得到回答,只提供了一个建议的解决方法。