【问题标题】:Get List of Primary Key Columns in Snowflake获取雪花中的主键列列表
【发布时间】:2021-01-11 00:51:43
【问题描述】:

我有一个复合主键。在 Information_Schema.Table_Constraints 中,我可以看到此键的 1 条记录,但它没有关于构成此主键的列的信息。

在哪里可以找到约束的列列表?

【问题讨论】:

    标签: constraints primary-key snowflake-cloud-data-platform composite-primary-key information-schema


    【解决方案1】:

    在数据库 TEST_DB 中显示主键; SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));

    【讨论】:

      【解决方案2】:

      您可以使用 SHOW PRIMARY KEYS 命令来查找构成给定主键的列。例如:

      CREATE OR REPLACE TABLE t1 (a INT, b INT, PRIMARY KEY (a,b));
      SHOW PRIMARY KEYS IN TABLE t1;
      
      created_on  database_name   schema_name table_name  column_name key_sequence    constraint_name comment
      2020-09-24 13:48:50.208 -0700   ANDREW_DB   PUBLIC  T1  A   1   SYS_CONSTRAINT_159d987b-8160-458e-bad1-50abda169c16 
      2020-09-24 13:48:50.208 -0700   ANDREW_DB   PUBLIC  T1  B   2   SYS_CONSTRAINT_159d987b-8160-458e-bad1-50abda169c16 
      

      您还可以使用以下命令查看给定上下文(您有权访问)中所有表的主键:

      SHOW PRIMARY KEYS IN SCHEMA;
      SHOW PRIMARY KEYS IN DATABASE;
      SHOW PRIMARY KEYS IN ACCOUNT;
      

      【讨论】:

        【解决方案3】:

        我有一个客户需要获取他们的表的复合主键作为结果集中的行返回。这是我为他们编写的用户定义表函数 (UDTF)。如果您不希望将其作为表格,则代码很容易修改为以数组、JSON 等形式返回。

        /**************************************************************************************************************
        *                                                                                                             *
        *  Set up test tables with four types of primary key: Named composite, unnamed composite, inline, and none.   * 
        *                                                                                                             *
        **************************************************************************************************************/
         
        -- Named multi-column PK
        create or replace temporary table table1
        (
        column_name1 number NOT NULL,
        column_name2 number NOT NULL,
        column_name3 string,
        CONSTRAINT Constraint_name PRIMARY KEY (column_name1, column_name2)
        );
         
        -- Unnamed multi-column PK
        create temporary table table2
        (
        column_name1 number NOT NULL,
        column_name2 number NOT NULL,
        column_name3 string,
        PRIMARY KEY (column_name1, column_name2)
        );
         
        -- Inline single-column PK
        create or replace temporary table table3
        (
        column_name1 number primary key,
        column_name2 number NOT NULL,
        column_name3 string
        );
         
        -- No PK defined
        create or replace temporary table table4
        (
        column_name1 number,
        column_name2 number,
        column_name3 string
        );
         
        /********************************************************************************************************
        *                                                                                                       *
        * User defined table function (UDTF) to get primary keys for a table.                                   *
        *                                                                                                       *
        * @param  {string}:  TABLE_DDL    The DDL for the table to get the PKs. Usually use get_ddl.            *
        * @return {table}:                A table with the columns comprising the table's primary key           *
        *                                                                                                       *
        ********************************************************************************************************/
        create or replace function GET_PK_COLUMNS(TABLE_DDL string)
        returns table (PK_COLUMN string)
        language javascript
        as
        $$
        {
            processRow: function get_params(row, rowWriter, context){
         
                var pkCols = getPKs(row.TABLE_DDL);
                for (i = 0; i < pkCols.length; i++) {
                    rowWriter.writeRow({PK_COLUMN: pkCols[i] }); 
                }
                 
                function getPKs(tableDDL) {
                    var keyword = "primary key";
                    var ins = -1;
                    var s = tableDDL.split("\n");
                    for (var i = 0; i < s.length; i++) {  
                        ins = s[i].indexOf(keyword);
                        if (ins != -1) {
                            var colList = s[i].substring(ins + keyword.length);
                            colList = colList.replace("(", "");
                            colList = colList.replace(")", "");
                            var colArray = colList.split(",");
                            for (c = 0; c < colArray.length; c++) {
                                colArray[c] = colArray[c].trim();
                            }
                            return colArray;
                        }
                    }
                    return [];  // No PK
                }
            }
        }
        $$;
         
        /**************************************************************************************************************
        *                                                                                                             *
        *  Test execution of the UDTF.                                                                                * 
        *                                                                                                             *
        **************************************************************************************************************/
         
        select * from table(get_pk_columns(get_ddl('table', 'table1'))) PKS;  -- Multi-column PK with named constraint
        select * from table(get_pk_columns(get_ddl('table', 'table2'))) PKS;  -- Multi-column PK with no name for constraint
        select * from table(get_pk_columns(get_ddl('table', 'table3'))) PKS;  -- Single column PK inline definition
        select * from table(get_pk_columns(get_ddl('table', 'table4'))) PKS;  -- No PKs
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-13
          • 1970-01-01
          • 2021-08-01
          • 2021-10-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多