要检查列是否自动递增,我可以执行以下操作
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.
是否还有另一个问题,Sybase中的列是否自动递增? 我认为“IS_AUTOINCREMENT”是JDBC4的一个功能,而jTDS是JDBC4兼容的驱动程序。
答案 0 :(得分:3)
Sybase使用'identity'列而不是'default autoincrement',这就是我相信你收到此消息的原因。
尝试检查TYPE_NAME列是否包含关键字“identity”。
标识列的行为也有一点不同,但这是暂时的。
答案 1 :(得分:1)
很抱歉,我误解了你在下面使用sp_help发现如果标识列包含1,那么该列是一个标识。
还有其他可用的方法。如果我知道你会对sp_help,sp_columns和从系统表中选择等SQL命令感到满意的话,那我就专注于Java方法了。
祝你好运。
答案 2 :(得分:0)
您使用的是什么版本的JConnect?尝试使用6.它应该使用:
了DatabaseMetaData.getTypeInfo()
PS。对不起该网站的新用户,没有足够的点评论你的帖子:(
答案 3 :(得分: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");
答案 4 :(得分: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);}
答案 5 :(得分:0)
如果您希望查询检查列是否为identity,则可以使用系统表syscolumns
。因此,根据sybase infocenter,syscolumns中列status
的值128是identity。
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
答案 6 :(得分: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:
}
}