[英]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.