繁体   English   中英

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

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

所以我正在研究AS400DB2 系统 我写了一个方法,它为我提供了每个物理表的主键 但是在某些表上,主键仅在逻辑表上设置。 在那里我的方法不起作用。

@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM