1

要检查列是否自动递增,我可以执行以下操作

Connection con = ...    
DatabaseMetaData meta = con.getMetaData();
ResultSet metaCols = meta.getColumns(catalog, schema, table, "%");
while ( metaCols.next() )   
     String value = rs.getString("IS_AUTOINCREMENT")    
  ...

除了 Sybase 数据库外,工作正常。我已经使用 jTDS 和 JConnect 驱动程序进行了尝试,但是使用这两个驱动程序我都得到了这个异常:

java.sql.SQLException: Invalid column name IS_AUTOINCREMENT.

是否有另一个 get 发现,Sybase 中的列是否自动递增?我认为“IS_AUTOINCREMENT”是 JDBC4 的一项功能,而 jTDS 是 JDBC4 兼容的驱动程序。

4

7 回答 7

3

Sybase 使用“identity”列而不是“default autoincrement”,这就是我相信您会收到此消息的原因。

尝试检查 TYPE_NAME 列是否包含关键字“身份”。

身份列的行为也有点不同,但这是一个问题。

于 2009-02-16T16:31:56.053 回答
1

抱歉,我误解了你在下面使用 sp_help 发现如果标识列包含 1 则该列是标识。

还有其他可用的方法。如果我知道您会对 SQL 命令(例如 sp_help、sp_columns 和从 systemtables 中进行选择)感到满意,那么我可以在几秒钟内给您答案,我当时正专注于 Java 方法。

祝你好运。

于 2009-02-17T13:10:26.983 回答
0

您使用的是哪个版本的 JConnect?尝试使用 6。它应该可以使用:

数据库元数据.getTypeInfo()

PS。对不起,新来的网站,没有足够的积分来评论你的帖子:(

于 2009-02-17T09:30:53.157 回答
0

sp_help 提供了我需要的所有信息。此 SP 返回几个 ResultSet。第三个 ResultSet 包含我需要的信息。

Statement stmt = con.createStatement();
stmt.executeQuery("sp_help " + table);
stmt.getMoreResults();
stmt.getMoreResults();
ResultSet rs = stmt.getResultSet();
//...
while( rs.next() )
   boolean identity = rs.getBoolean("Identity");
于 2009-02-17T12:16:25.067 回答
0

这是获取身份信息的最简单方法



ResultSet tableInfo = tableInfoQuery.executeQuery("SELECT * FROM " + tableName + " WHERE 1=2");
ResultSetMetaData rsMetaData = tableInfo.getMetaData();
for (int i = 1; i < = rsMetaData.getColumnCount(); i++)
{rsMetaData.isAutoIncrement(i);}


于 2009-06-25T22:28:16.390 回答
0

如果要查询以检查列是否标识,可以使用 system table syscolumns。因此,根据sybase 信息中心status,syscolumns中列的值 128是标识。

select * from sysobjects so
inner join syscolumns sc on so.id=sc.id
where so.name='EX_EMPLOYEE' and sc.name='ID' and sc.status=128
于 2018-04-19T07:57:53.307 回答
0
Connection conn; <...create connection...>
ResultSet rs1 = conn.createStatement().executeQuery("SELECT * FROM table1");
ResultSetMetaData rsmd1 = rs1.getMetadata();
for (int i=1;i<rsmd1.getColumnCount();i++) { 
switch (rsmd1.getColumnTypeName(i).toUpperCase())
  case "ID":
    System.out.println("Identity column: " + rsmd1.getColumnName(i));
    break;
  default: 
}
}
于 2019-08-07T14:15:13.470 回答