从 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 来解决此问题。
我无法从针对 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 来解决此问题。