【问题标题】:Show tables, describe tables equivalent in redshift显示表格,描述在 redshift 中等效的表格
【发布时间】:2013-09-15 00:24:31
【问题描述】:

我是 aws 新手,谁能告诉我 redshift 与 mysql 命令的等效项是什么?

show tables -- redshift command
describe table_name -- redshift command

【问题讨论】:

    标签: amazon-web-services amazon-redshift


    【解决方案1】:

    redshift 现在支持显示表

    show table analytics.dw_users
    

    https://forums.aws.amazon.com/ann.jspa?annID=8641

    【讨论】:

      【解决方案2】:

      所有信息都可以在PG_TABLE_DEFdocumentation 中找到。

      列出 public 架构中的所有表(默认) - show tables 等效项:

      SELECT DISTINCT tablename
      FROM pg_table_def
      WHERE schemaname = 'public'
      ORDER BY tablename;
      

      一个名为 table_name 的表中所有列的描述 - describe table 等效项:

      SELECT *
      FROM pg_table_def
      WHERE tablename = 'table_name'
      AND schemaname = 'public';
      

      更新:

      正如@Kishan Pandey 的回答所指出的,如果您正在寻找与public 不同的架构的详细信息,您需要set search_path to my_schema。 (show search_path显示当前搜索路径)

      列出my_schema 架构中的表:

      set search_path to my_schema;
      select * from pg_table_def;
      

      【讨论】:

      • 有没有办法获取各个列的默认值集?
      • pg_table_def 也返回索引。改用select distinct table_name from information_schema.columns where table_schema = 'public' 更安全。
      • 是按列顺序吗?
      • 请参阅alberton.info/postgresql_meta_info.html,了解一些提取列信息(包括顺序)的更简单方法
      • 正如@Kishan Pandey 的回答所指出的那样,如果您正在寻找与公众不同的架构的详细信息,您需要set search_path to my_schema 并因此更新查询以过滤schemaname = 'my_schema'跨度>
      【解决方案3】:

      快捷方式

      \d 用于显示所有表格

      \d 表名来描述表

      \?更多关于 redshift 的快捷方式

      【讨论】:

        【解决方案4】:

        Tomasz Tybulewicz 的回答是不错的选择。

        SELECT * FROM pg_table_def WHERE tablename = 'YOUR_TABLE_NAME' AND schemaname = 'YOUR_SCHEMA_NAME';
        

        如果搜索路径中未定义架构名称,则该查询将显示空结果。 请先通过以下代码检查搜索路径。

        SHOW SEARCH_PATH
        

        如果搜索路径中未定义架构名称,您可以重置搜索路径。

        SET SEARCH_PATH to '$user', public, YOUR_SCEHMA_NAME
        

        【讨论】:

        • 您可能希望将搜索路径注释添加到 Tomasz 的答案中。我第一次使用 pg 视图时遇到了这个问题,不得不研究它。
        • 这是与SEARCH_PATH 相关的正确解决方案。但我只需要set search_path to my_schema_name
        【解决方案5】:

        我必须从信息架构中进行选择才能获取我的表和列的详细信息;如果它对任何人有帮助:

        SELECT * FROM information_schema.tables
        WHERE table_schema = 'myschema'; 
        
        SELECT * FROM information_schema.columns
        WHERE table_schema = 'myschema' AND table_name = 'mytable'; 
        

        【讨论】:

        • 我将所有 Segment SQL 数据存储到 AWS Redshift,到目前为止,这是我遇到的唯一对我有用的解决方案!
        • 我觉得这是最好的方法。 Redshift 中的 information_schema 是 pg_table 的超集。此外,pg_table_def 似乎存在某种权限问题:虽然架构/表将在 pg_tables 中,但 pg_table_def 中的相应信息将不存在。我得到的只是 pg_catalog 和公共模式。令人沮丧。
        • @MarkGerolimatos 要查看pg_table_def 中的表,您必须将架构添加到您的SEARCH_PATH:SET SEARCH_PATH to '$user', public, YOUR_SCEHMA_NAME。绝对不直观...
        • @MarcoRoy 值得一提的是,正如我从查询结果中看到的那样,pg_table_def 提供的信息更多。 pg_table_def 显示列是distkey 还是sortkey 及其编码,information_schema.columns 中没有显示。我猜这就是 DataGrip 等 SQL 客户端获取 DDL 的地方。
        【解决方案6】:

        在下面的帖子中,我记录了从 Redshift 检索 TABLE 和 COLUMN cmets 的查询。 https://sqlsylvia.wordpress.com/2017/04/29/redshift-comment-views-documenting-data/

        享受吧!

        表格注释

            SELECT n.nspname AS schema_name
             , pg_get_userbyid(c.relowner) AS table_owner
             , c.relname AS table_name
             , CASE WHEN c.relkind = 'v' THEN 'view' ELSE 'table' END 
               AS table_type
             , d.description AS table_description
             FROM pg_class As c
             LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
             LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
             LEFT JOIN pg_description As d 
                  ON (d.objoid = c.oid AND d.objsubid = 0)
             WHERE c.relkind IN('r', 'v') AND d.description > ''
             ORDER BY n.nspname, c.relname ;
        

        列评论

            SELECT n.nspname AS schema_name
             , pg_get_userbyid(c.relowner) AS table_owner
             , c.relname AS table_name
             , a.attname AS column_name
             , d.description AS column_description
            FROM pg_class AS c
            INNER JOIN pg_attribute As a ON c.oid = a.attrelid
            INNER JOIN pg_namespace n ON n.oid = c.relnamespace
            LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
            LEFT JOIN pg_description As d 
             ON (d.objoid = c.oid AND d.objsubid = a.attnum)
            WHERE c.relkind IN('r', 'v')
             AND a.attname NOT         
             IN ('cmax', 'oid', 'cmin', 'deletexid', 'ctid', 'tableoid','xmax', 'xmin', 'insertxid')
            ORDER BY n.nspname, c.relname, a.attname;
        

        【讨论】:

          【解决方案7】:

          您可以简单地使用下面的命令来描述一个表格。

          desc table-name
          

          desc schema-name.table-name
          

          【讨论】:

            【解决方案8】:

            您可以使用 -desc / 查看 Redshift 中的视图/表定义。我一直在使用 Workbench/J 作为 Redshift 的 SQL 客户端,它在与 Result 选项卡相邻的 Messages 选项卡中给出了定义。

            【讨论】:

            • 谢谢!仍然缺少列出表格的方式:/
            【解决方案9】:

            或者简单地说:

            \dt 显示表格

            \d+ <table name>描述一张表

            编辑:使用 psql 命令行客户端工作

            【讨论】:

            • 这对我不起作用 .. 它适用于 Posgres 但不适用于 Redshift .. 最好选择 Tomasz 的回答。
            • 我正在通过 SQLWorkbench 访问 Redshift(按照 AWS 入门指南中的建议)。如果我尝试\dt,我会得到Error: Syntax error at or near "\"。您是否以其他方式访问 Redshift?
            • 是的,使用 psql 命令行客户端。我会更新我的答案。
            • 实际上我没有意识到您可以使用 psql 客户端连接到 Redshift,但它在 Amazon 文档中。它实际上非常有用。谢谢。
            • 它显示的信息与 Tomasz 的解决方案略有不同。例如,\d+ tablename 不显示排序键信息。
            猜你喜欢
            • 2013-12-07
            • 2016-12-06
            • 1970-01-01
            • 2018-01-26
            • 1970-01-01
            • 2023-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多