从 DB2 Warehouse 中组织 table 的列获取生成的键

Get generated key from column organized table in DB2 Warehouse

我无法从针对 IBM DB2 仓库的 INSERT SQL 语句 运行 组织的列 table 中获取生成的密钥。我正在使用 Java 和 JDBC 驱动程序。一切正常 - 我能够连接到数据库,创建 tables,插入数据,如果它是在组织 table 的列中生成的,我只是无法获得生成的密钥。请注意,行组织 table 工作正常并且 return 键正确。

考虑 table:

CREATE TABLE users (
   id       INTEGER not null GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
   username VARCHAR(16),
   PRIMARY KEY (id)
);

如果这是按行组织的 table 我可以通过以下方式获得生成的密钥:

PreparedStatement pr = connection.prepareStatement("INSERT INTO users(username) VALUES(?)", PreparedStatement.RETURN_GENERATED_KEYS);

但是,如果这是组织的列 table,则 PreparedStatemnt 创建失败并出现错误:

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-1667, SQLSTATE=42858, SQLERRMC=BLUADMIN.USERS;ORGANIZE BY COLUMN;FINAL|NEW|OLD TABLE, DRIVER=4.25.13

即使我指定了列,我也想像这样 returned:

PreparedStatement pr = connection.prepareStatement("INSERT INTO users(username) VALUES(?)", new String[]{"id","username"});

pr.setString(1, "test");
pr.executeUpdate();   

我明白了

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-1667, SQLSTATE=42858, SQLERRMC=BLUADMIN.USERS;ORGANIZE BY COLUMN;FINAL|NEW|OLD TABLE, DRIVER=4.25.13

在线 pr.executeUpdate();

这是否意味着无法从 DB2 Warehouse 中的 INSERT 语句组织的列 table 中获取生成的键?

您是否尝试过实际选择生成的 ID?尝试这样的事情:

SELECT ID FROM FINAL TABLE
    (INSERT INTO users(username) VALUES(?))

请参阅 IBM Db2 文档中的“Retrieval of result sets from an SQL data change statement”。

当前发布的版本 v11.1.x 和 V11.5.x 将在发送到 Db2 的查询使用 'FINAL TABLE' 或 'OLD TABLE' 或 [=24= 时抛出 SQL1667N ] 列组织的子句 table.

当您使用 jdbc 语法 PreparedStatement.RETURN_GENERATED_KEYS 时,可能会在幕后使用此语法。

目前,ORGANIZE BY COLUMN tables 不支持这些子句(即会导致抛出异常)。在使用 table 前,您应该了解列组织的其他限制。

您可以通过使用 ORGANIZE BY ROW 子句显式创建 table 来解决此问题。