您好我正在尝试检索现有表的架构。我是mysql开发人员,我正在尝试使用amazon redshift。如何导出现有表的架构。在mysql中我们可以使用show create table命令。
SHOW CREATE TABLE tblName;
答案 0 :(得分:9)
此查询将以create语句的形式为您提供完整的模式定义,包括Redshift特定属性分发类型/键,排序键,主键和列编码,以及提供设置所有者的alter table语句给当前的老板。它唯一不能告诉你的是外键。我正在研究后者,但RS中存在一个当前特权问题,导致我们无法查询正确的表格。这个查询可以使用一些调整,但我没有时间或需要进一步工作。
select pk.pkey, tm.schemaname||'.'||tm.tablename, 'create table '||tm.schemaname||'.'||tm.tablename
||' ('
||cp.coldef
-- primary key
||decode(pk.pkey,null,'',pk.pkey)
-- diststyle and dist key
||decode(d.distkey,null,') diststyle '||dist_style||' ',d.distkey)
--sort key
|| (select decode(skey,null,'',skey) from (select
' sortkey(' ||substr(array_to_string(
array( select ','||cast(column_name as varchar(100)) as str from
(select column_name from information_schema.columns col where col.table_schema= tm.schemaname and col.table_name=tm.tablename) c2
join
(-- gives sort cols
select attrelid as tableid, attname as colname, attsortkeyord as sort_col_order from pg_attribute pa where
pa.attnum > 0 AND NOT pa.attisdropped AND pa.attsortkeyord > 0
) st on tm.tableid=st.tableid and c2.column_name=st.colname order by sort_col_order
)
,'')
,2,10000) || ')' as skey
))
||';'
-- additional alter table queries here to set owner
|| 'alter table '||tm.schemaname||'.'||tm.tablename||' owner to "'||tm.owner||'";'
from
-- t master table list
(
SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid ,use2.usename as owner, decode(c.reldiststyle,0,'EVEN',1,'KEY',8,'ALL') as dist_style
FROM pg_namespace n, pg_class c, pg_user use2
WHERE n.oid = c.relnamespace
AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
AND c.relname <> 'temp_staging_tables_1'
and c.relowner = use2.usesysid
) tm
-- cp creates the col params for the create string
join
(select
substr(str,(charindex('QQQ',str)+3),(charindex('ZZZ',str))-(charindex('QQQ',str)+3)) as tableid
,substr(replace(replace(str,'ZZZ',''),'QQQ'||substr(str,(charindex('QQQ',str)+3),(charindex('ZZZ',str))-(charindex('QQQ',str)+3)),''),2,10000) as coldef
from
( select array_to_string(array(
SELECT 'QQQ'||cast(t.tableid as varchar(10))||'ZZZ'|| ','||column_name||' '|| decode(udt_name,'bpchar','char',udt_name) || decode(character_maximum_length,null,'', '('||cast(character_maximum_length as varchar(9))||')' )
-- default
|| decode(substr(column_default,2,8),'identity','',null,'',' default '||column_default||' ')
-- nullable
|| decode(is_nullable,'YES',' NULL ','NO',' NOT NULL ')
-- identity
|| decode(substr(column_default,2,8),'identity',' identity('||substr(column_default,(charindex('''',column_default)+1), (length(column_default)-charindex('''',reverse(column_default))-charindex('''',column_default) ) ) ||') ', '')
-- encoding
|| decode(enc,'none','',' encode '||enc)
as str
from
-- ci all the col info
(
select cast(t.tableid as int), cast(table_schema as varchar(100)), cast(table_name as varchar(100)), cast(column_name as varchar(100)),
cast(ordinal_position as int), cast(column_default as varchar(100)), cast(is_nullable as varchar(20)) , cast(udt_name as varchar(50)) ,cast(character_maximum_length as int),
sort_col_order , decode(d.colname,null,0,1) dist_key , e.enc
from
(select * from information_schema.columns c where c.table_schema= t.schemaname and c.table_name=t.tablename) c
left join
(-- gives sort cols
select attrelid as tableid, attname as colname, attsortkeyord as sort_col_order from pg_attribute a where
a.attnum > 0 AND NOT a.attisdropped AND a.attsortkeyord > 0
) s on t.tableid=s.tableid and c.column_name=s.colname
left join
(-- gives encoding
select attrelid as tableid, attname as colname, format_encoding(a.attencodingtype::integer) AS enc from pg_attribute a where
a.attnum > 0 AND NOT a.attisdropped
) e on t.tableid=e.tableid and c.column_name=e.colname
left join
-- gives dist col
(select attrelid as tableid, attname as colname from pg_attribute a where
a.attnum > 0 AND NOT a.attisdropped AND a.attisdistkey = 't'
) d on t.tableid=d.tableid and c.column_name=d.colname
order by ordinal_position
) ci
-- for the working array funct
), '') as str
from
(-- need tableid
SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid
FROM pg_namespace n, pg_class c
WHERE n.oid = c.relnamespace
AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
) t
)) cp on tm.tableid=cp.tableid
-- primary key query here
left join
(select c.oid as tableid, ', primary key '|| substring(pg_get_indexdef(indexrelid),charindex('(',pg_get_indexdef(indexrelid))-1 ,60) as pkey
from pg_index i , pg_namespace n, pg_class c
where i.indisprimary=true
and i.indrelid =c.oid
and n.oid = c.relnamespace
) pk on tm.tableid=pk.tableid
-- dist key
left join
( select
-- close off the col defs after the primary key
')' ||
' distkey('|| cast(column_name as varchar(100)) ||')' as distkey, t.tableid
from information_schema.columns c
join
(-- need tableid
SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid
FROM pg_namespace n, pg_class c
WHERE n.oid = c.relnamespace
AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
) t on c.table_schema= t.schemaname and c.table_name=t.tablename
join
-- gives dist col
(select attrelid as tableid, attname as colname from pg_attribute a where
a.attnum > 0 AND NOT a.attisdropped AND a.attisdistkey = 't'
) d on t.tableid=d.tableid and c.column_name=d.colname
) d on tm.tableid=d.tableid
where tm.schemaname||'.'||tm.tablename='myschema.mytable'
答案 1 :(得分:7)
最近我写了一个python脚本来克隆redshift集群之间的表模式。如果您只想要表的列和列类型,可以通过以下方式完成:
select column_name,
case
when data_type = 'integer' then 'integer'
when data_type = 'bigint' then 'bigint'
when data_type = 'smallint' then 'smallint'
when data_type = 'text' then 'text'
when data_type = 'date' then 'date'
when data_type = 'real' then 'real'
when data_type = 'boolean' then 'boolean'
when data_type = 'double precision' then 'float8'
when data_type = 'timestamp without time zone' then 'timestamp'
when data_type = 'character' then 'char('||character_maximum_length||')'
when data_type = 'character varying' then 'varchar('||character_maximum_length||')'
when data_type = 'numeric' then 'numeric('||numeric_precision||','||numeric_scale||')'
else 'unknown'
end as data_type,
is_nullable,
column_default
from information_schema.columns
where table_schema = 'xxx' and table_name = 'xxx' order by ordinal_position
;
但是如果你需要压缩类型和distkey / sortkeys,你需要查询另一个表:
select * from pg_table_def where tablename = 'xxx' and schemaname='xxx';
答案 2 :(得分:5)
如果要使用create语句,约束和触发器获取表结构,可以使用pg_dump实用程序
pg_dump -U user_name -s -t table_name -d db_name
Note: -s used for schema only dump
if you want to take the data only dump , you can use -a switch.
这将输出包含所有约束的create语法。希望这会对你有所帮助。
答案 3 :(得分:5)
我没有找到任何完整的解决方案。 并编写了一个python脚本:
https://github.com/cxmcc/redshift_show_create_table
它将像pg_dump一样工作,加上处理基本的红移功能,SORTKEY / DISTKEY / DISTSTYLES等。
答案 4 :(得分:2)
在Postgres中,您将查询目录。
从psql
开始,使用短语到各种命令,使用\?
获取其列表(寻求帮助)。因此,无论是:
\d yourtable
\d+ yourtable
要在应用中使用,您需要了解相关的相关查询。运行psql -E
(对于echo隐藏查询)而不是普通psql
,这是相对简单的。
如果您需要精确的create table语句,请参阅@Anant answer。
答案 5 :(得分:1)
显示表在Redshift上不起作用:
window.location
我们可以使用pg_table_def表获取模式:
const animals = [
{name: 'Fluffy', species: 'cat'},
{name: 'Crinkle', species: 'rabbit'},
{name: 'Wally', species: 'dog'},
{name: 'Roo', species: 'dog'},
{name: 'Felix', species: 'cat'},
]
var result = animals.filter(val=>val.species=="dog").map(({name})=>name);
console.log(result);
注意:如果架构不在搜索路径上,请使用以下方式将其添加到搜索路径:
show table <YOUR_TABLE>;
ERROR: syntax error at or near "<YOUR_TABLE>"
答案 6 :(得分:0)
您是需要以编程方式还是从psql提示符检索它?
在psql中使用:\ d + tablename
以编程方式,您可以查询此处记录的ANSI标准INFORMATION_SCHEMA视图:
http://www.postgresql.org/docs/9.1/static/information-schema.html
INFORMATION_SCHEMA.TABLES和INFORMATION_SCHEMA.COLUMNS视图应该具备您所需的信息。
答案 7 :(得分:0)
一种简单的方法是使用AWS提供的实用程序。您需要做的就是在数据库中创建视图,然后查询该视图以获取任何表ddl。使用此视图的好处是,它还将为您提供原始create table命令中使用的sortkey和distkey。
https://github.com/awslabs/amazon-redshift-utils/blob/master/src/AdminViews/v_generate_tbl_ddl.sql
创建视图后,即可获取任何表的ddl。您需要这样查询-
select ddl from table where tablename='table_name' and schemaname='schemaname';
注意:群集中可能尚不存在管理架构。因此,您可以在公共架构中创建此视图。
答案 8 :(得分:0)
您可以使用AWS Redshift提供的管理视图-https://github.com/awslabs/amazon-redshift-utils/blob/master/src/AdminViews/v_generate_tbl_ddl.sql
一旦创建了视图,就可以通过运行以下命令获取架构创建脚本:
select * from <db_schema>.v_generate_tbl_ddl where tablename = '<table_name>'
答案 9 :(得分:0)
要获取特定表的列数据和架构:
要获取表元数据的信息,请触发以下查询
答案 10 :(得分:0)
以下查询将为您生成表的DDL:
SELECT ddl
FROM admin.v_generate_tbl_ddl
WHERE schemaname = '<schemaname>'
AND tablename in (
'<tablename>');
答案 11 :(得分:-1)
以下命令将起作用:
mysql > show create table test.users_info;
Redshift/postgress >pg_dump -U root-w --no-password -h 62.36.11.547 -p 5439 -s -t test.users_info ;