如何从 DB2 中的逻辑表中获取主键?

How can I get the Primary Keys from logical Tables in DB2?

所以我正在研究 AS400DB2 系统。 我写了一个方法,它为我提供了每个 physical table 的 Primary Keys。但在某些 table 上,主键仅设置在 逻辑 table 上。那里我的方法不行。

@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;
    
    }

对于物理 table 它有效,但对于逻辑 Table 它无效。 您知道 如何从逻辑 table.

中获取主键吗

Logical files do not contain data. They contain a description of records that are found in one or more physical files. A logical file is a view or representation of one or more physical files

says the manual。与传统 RDBMS 中的视图类似,您不能为逻辑文件定义主键。

所以基本上你拥有的是没有主键定义的物理文件(或SQL tables)和用唯一键定义的逻辑文件或(SQL索引)。

在 IBM i 上,逻辑文件可以充当 SQL 索引和 SQL 视图,或同时充当两者。正如 Mustaccio 提到的,对象中没有任何实际数据。

您最好的选择可能是查询 SYSTABLEINDEXS catalog view 以查找给定 table 上的主键或唯一索引。

您也可以看看 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;