【问题标题】:How can I get the Primary Keys from logical Tables in DB2?如何从 DB2 中的逻辑表中获取主键?
【发布时间】:2020-10-16 09:20:37
【问题描述】:

所以我正在研究 AS400DB2 系统。 我编写了一个方法,它为我提供了每个 physical 表的 Primary Keys。但在某些表上,主键只设置在 logical 表上。那里我的方法不起作用。

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

对于一个物理表它可以工作,但对于一个逻辑表它不是。 您知道如何从逻辑表中获取主键

【问题讨论】:

    标签: java database db2 metadata resultset


    【解决方案1】:

    逻辑文件不包含数据。它们包含对一个或多个物理文件中的记录的描述。逻辑文件是一个或多个物理文件的视图或表示

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

    【讨论】:

      【解决方案2】:

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

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

      最好的办法是查询SYSTABLEINDEXS catalog view 以查找给定表的主键或唯一索引。

      您还可以查看getIndexes() 方法。

      【讨论】:

        【解决方案3】:

        我通过从“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;
        

        【讨论】:

          猜你喜欢
          • 2011-11-08
          • 1970-01-01
          • 2011-01-21
          • 2022-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多