如何在Progress db中获取表之间的关系

时间:2018-02-01 15:00:03

标签: openedge progress-4gl

我想获得正在进行的表的关系db。例如:

OrderDetail: Date, Product_Id, Order_Id, Quantity

在这种情况下,我希望Product_IdOrder_Id列是外键

2 个答案:

答案 0 :(得分:3)

OpenEdge数据库没有明确支持"外键"。

某些应用程序模式具有可能对您有帮助的命名约定。

正如迈克所提到的,你可以循环遍历元模式表_file,_field和_index并应用遵循这种命名约定的逻辑,但是没有可以应用于所有OpenEdge数据库的通用解决方案。

例如,如果您命名约定是tableNameId的字段名称表示tableName的潜在外键,您可以尝试类似:

find _file no-lock where _file._file-name = "tableName" no-error.
if available( _file ) then
  do:

    find _field no-lock where _file-recid = recid ( _file ) and _field-name = "tableNameId" no-error.

    if available( _field ) then
      do:

        message "common field exists!".

        find first _index-field no-lock where _field-recid = recid( _field ) no-error.
        if available( _index-field ) then
          do:

            message "and there is at least one index on tableNameId!".

            find _index no-lock where recid( _index ) = _index-recid no-error.

            message _index-name _unique _num-comp.  /* you probably want a unique single component index */

          end.

      end.

  end.

答案 1 :(得分:0)

虽然OpenEdge数据库和ABL引擎不了解关系或外部密钥,但SQL引擎确实实现了外键约束。看到 https://knowledgebase.progress.com/articles/Article/000034195

我不知道这对你有用。如果这些约束不存在,则首先定义这些约束,如果您的应用程序主要是ABL而不是SQL,则不太可能。该网站还需要通过SQL访问数据库。在ABL代码中编写SQL语句是不够的,访问需要通过SQL引擎。