【发布时间】:2018-11-06 19:23:45
【问题描述】:
我的 Azure SQL 数据仓库数据库中有一个这样的表:
CREATE TABLE t_identity (
id INTEGER IDENTITY (1, 1) NOT NULL,
val INTEGER
)
现在,我想使用 JDBC 插入一行并获取生成的标识值。这适用于 SQL Server 和大多数其他数据库:
try (Connection c = DriverManager.getConnection(url, properties);
Statement s = c.createStatement()) {
s.executeUpdate("insert into t_identity (val) values (1)",
Statement.RETURN_GENERATED_KEYS);
try (ResultSet rs = s.getGeneratedKeys()) {
while (rs.next())
System.out.println(rs.getObject(1));
}
}
但在 SQL 数据仓库上,它不起作用:
Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: 'SCOPE_IDENTITY' is not a recognized built-in function name.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:264)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1585)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(SQLServerStatement.java:876)
at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtExecCmd.doExecute(SQLServerStatement.java:776)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7385)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2750)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:235)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:210)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeUpdate(SQLServerStatement.java:2060)
at SQLServer.main(SQLServer.java:65)
其他方法(例如executeUpdate(String, String[]))也不起作用,因为它们委托给上述方法。
我了解 SQL 数据仓库不支持 SCOPE_IDENTITY() and similar functions,这似乎是 mssql-jdbc 驱动程序在幕后使用的:
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>6.5.2.jre8-preview</version>
</dependency>
但是有解决方法吗?
注意事项:
【问题讨论】:
-
我会说这是在创建表脚本中使用
IDENTITY的问题,请考虑改用PRIMARY KEY AUTOINCREMENT -
@DDS:嗯,没有:)
-
@DDS 你好像认为这个问题是关于 MySQL 的
-
在 DW 中并不少见的用例是,只有一个 ETL 作业 填充表。在这种情况下,身份或序列生成的 ID 并没有真正的利润。作业可以控制键分配。只是 0.02,我不知道你的确切用例......
-
@MarmiteBomber:当然,但是为什么在第一种情况下支持
IDENTITY列?我的用例是在 jooq.org 中实现 SQL 数据仓库,所以我不能在这里推测任何可能的用例......
标签: sql jdbc azure-sqldw