簡體   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