如何获取雪花中的表主键列表?

Posted

技术标签:

【中文标题】如何获取雪花中的表主键列表?【英文标题】:How to get list of table primary keys in snowflake? 【发布时间】:2021-05-25 09:09:38 【问题描述】:

我想在雪花列表中获取表的所有主键。 我用过

SHOW PRIMARY KEYS IN TABLE t1

但输出是一组列:

"created_on"    "database_name" "schema_name"   "table_name"    "column_name"   "key_sequence"  "constraint_name"   "comment"

我只需要 column_name 列。 我试着做:

select a.* from (SHOW PRIMARY KEYS IN TABLE t1) a

但我收到了这个错误:

SQL Error [1003] [42000]: SQL compilation error:
syntax error line 1 at position 17 unexpected 'SHOW'.

如果有人有想法,请帮忙。谢谢。

【问题讨论】:

【参考方案1】:

您可以使用 RESULT_SCAN 函数来处理 SHOW 命令的输出:

https://docs.snowflake.com/en/sql-reference/functions/result_scan.html

SHOW PRIMARY KEYS IN TABLE t1;

SELECT * FROM table(RESULT_SCAN( LAST_QUERY_ID() ));

另一个示例:

SHOW PRIMARY KEYS IN TABLE test1;
select last_query_id();

This is the result:
-------------------
019c7ab2-3200-9e9b-0000-b4550014773e

然后我将它与 RESULT_SCAN 一起使用:

SELECT * FROM table(RESULT_SCAN( '019c7ab2-3200-9e9b-0000-b4550014773e'));

请注意,last_query_id 将始终返回当前会话中的最后一个查询。它不返回与其他会话一起执行的查询 ID。

【讨论】:

我试过了,这不起作用。由于 result_scan 基于最后一个命令,我认为它是不稳定的解决方案。 你可以在SHOW命令之后直接运行,或者你可以得到查询ID,并把它代替LAST_QUERY_ID() 但是在我运行 SHOW PRIMARY KEYS IN TABLE t1; 之后,我运行了 select last_query_id 并且我得到了另一个查询——可能是使用模式或类似的东西 好的,但是如果我想像表格一样使用结果-我的意思是,执行 select column_name 而不仅仅是 select *- 可以吗? 是的,这是可能的。只需使用区分大小写格式的列名:SELECT "table_name", "column_name" FROM table(RESULT_SCAN('019c7ab2-3200-9e9b-0000-b4550014773e'));如果它解决了问题,请不要忘记将答案标记为正确!谢谢【参考方案2】:

不久前,我为需要以编程方式将表的 PK 列作为表返回的客户编写了一个 UDTF(用户定义的表函数)。这可能与您要执行的操作一致,但如果您希望将返回作为列表而不是表格,则可能需要进行一些调整。

您可以在此处查看其工作原理的示例https://snowflake.pavlik.us/index.php/2020/07/29/getting-snowflake-primary-key-columns-as-a-table/

/********************************************************************************************************
*                                                                                                       *
* 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 c;
            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 (pkc = 0; c < colArray.length; pkc++) 
                        colArray[pkc] = colArray[pkc].trim();
                    
                    return colArray;
                
            
            return [];  // No PK
        
    

$$;

【讨论】:

以上是关于如何获取雪花中的表主键列表?的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句获取数据库中的表主键,自增列,所有列

SQL Server 主表主键自增量,如何获取主键呢?

Android Room - 如何在每个应用程序运行时重置自动生成的表主键

Mybatis框架---Mybatis自定义插件生成雪花ID做为表主键项目

如何在SQL Server中获取具有复合主键的表列表?

小白知识:数据库表主键ID生成策略及snowflake雪花算法的由来