[英]How can I get the Primary Keys from logical Tables in DB2?
所以我正在研究AS400 、 DB2 系统。 我写了一个方法,它为我提供了每个物理表的主键。 但是在某些表上,主键仅在逻辑表上设置。 在那里我的方法不起作用。
@Override
public ArrayList<Field> getPKS(String lib) {
ArrayList<Field> pkList = new ArrayList<>();
try (Connection connection = DriverManager.getConnection("jdbc:as400://" + ConnectionData.SYSTEM + ";naming=system;libraries=*" + lib + ";",
ConnectionData.USER, ConnectionData.PASSWORD);
ResultSet rs = connection.getMetaData().getPrimaryKeys(null, connection.getSchema(), "LSAVSLA")){
while (rs.next()) {
pkList.add(new Field(rs.getString("COLUMN_NAME")));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return pkList;
}
对于物理表它可以工作,但对于逻辑表它不是。 您知道如何从逻辑表中获取主键吗?
逻辑文件不包含数据。 它们包含在一个或多个物理文件中找到的记录的描述。 逻辑文件是一个或多个物理文件的视图或表示
手册上说。 与传统 RDBMS 中的视图类似,您不能为逻辑文件定义主键。
所以基本上你拥有的是没有主键定义的物理文件(或 SQL 表)和使用唯一键定义的逻辑文件或(SQL 索引)。
在 IBM i 上,逻辑文件可以充当 SQL 索引和 SQL 视图,或者同时充当两者。 正如 Mustaccio 所提到的,对象中没有任何实际数据。
您最好的选择是查询SYSTABLEINDEXS 目录视图,以查找给定表的主键或唯一索引。
您还可以查看getIndexes()方法。
我通过从“QSYS.QADBKATR”中选择“DBKFLD”字段找到了一个解决方案
SQL 查询:
SELECT DBKFLD FROM QSYS.QADBKATR WHERE DBKLIB = "Your lib" AND DBKFIL = "Your table"
Java代码:
Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet resultSetQuery = statement.executeQuery("select DBKFLD from QSYS.QADBKATR where DBKLIB = '" + lib + "' and DBKFIL = '" + tablename + "'")) {
ResultSetMetaData metadata = resultSetQuery.getMetaData();
int columnCount = metadata.getColumnCount();
while (resultSetQuery.next()) {
for (int i = 1; i <= columnCount; i++) {
String pk = resultSetQuery.getString(i);
pk = pk.replaceAll("\\s+", "");
pkList.add(new Feld(pk));
}
}
return pkList;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.