amazon redshift 中存储的特定行的默认值在哪里?

Posted

技术标签:

【中文标题】amazon redshift 中存储的特定行的默认值在哪里?【英文标题】:Where are default values for a particular row stored in amazon redshift? 【发布时间】:2015-12-04 05:40:17 【问题描述】:

我想将 Redshift 表转换为 JSON,以便可以从此 JSON 自动生成 sql 查询。为此,我需要在系统表中以某种或其他格式提供的数据类型、列名 distkey 和 sortkey。我不知道的一件事是如何提取红移列的默认值。

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

这应该回答你的问题:Get the default values of table columns in Postgres?

总结:

如果您只有一个架构,INFORMATION_SCHEMA.COLUMNS 效果很好。如果您有多个跨模式具有相同名称的表,则会变得更加棘手。

这适用于所有情况:

SELECT d.adsrc AS default_value
FROM   pg_catalog.pg_attribute a
LEFT   JOIN pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum)
                                     = (d.adrelid,  d.adnum)
WHERE  NOT a.attisdropped   -- no dropped (dead) columns
AND    a.attnum > 0         -- no system columns
AND    a.attrelid = 'myschema.mytable'::regclass
AND    a.attname = 'mycolumn';

我在生产中使用稍微不同的版本来获取类型(以及每列的适当长度):

SELECT
            pg_namespace.nspname AS schema_name,
            pg_class.relname AS table_name,
            pg_attribute.attname AS column_name,
            pg_type.typname AS type,
            pg_attribute.atttypmod AS column_len,
            pg_attrdef.adsrc AS column_default
FROM
            pg_class
INNER JOIN
            pg_namespace
            ON pg_class.relnamespace = pg_namespace.oid
INNER JOIN
            pg_attribute
            ON pg_class.oid = pg_attribute.attrelid
INNER JOIN
            pg_type
            ON pg_attribute.atttypid = pg_type.oid
LEFT JOIN 
            pg_attrdef  
            ON pg_attribute.attrelid = pg_attrdef.adrelid
            AND pg_attribute.attnum = pg_attrdef.adnum
WHERE
            pg_class.relname = 'table_name'
            AND pg_namespace.nspname = 'schema_name'
            AND pg_type.typname NOT IN ('oid','xid','tid','cid')
            AND pg_attribute.attnum >= 0
ORDER BY
            pg_attribute.attnum ASC
;

【讨论】:

【参考方案2】:

Redshift 与 postgresql 几乎相同。使用它,您可以从表INFORMATION_SCHEMA.COLUMNS 中获取该列的默认值。

我已经在 postgre 中检查过:

create table test_tbl (n int DEFAULT 100500);

select table_name, column_name, column_default from INFORMATION_SCHEMA.COLUMNS where table_name = 'test_tbl';

 table_name | column_name | column_default 
------------+-------------+----------------
 test_tbl   | n           | 100500

【讨论】:

以上是关于amazon redshift 中存储的特定行的默认值在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

在 Amazon Redshift 上插入行的事务的 ID

如何使用 pandas 或 python 将具有数百万行的表从 PostgreSQL 复制到 Amazon Redshift

Amazon Redshift 按特定值排序

从 Amazon Redshift 中的 json 数组中提取特定键

在 Amazon Redshift 中存储极小的值

Redshift 存储过程 - [Amazon](500310) 无效操作:“$1”处或附近的语法错误;