2016-06-01 8 views
0

Ich habe versucht, den Code zu verwenden, schlug auf dem Postgresql Wiki (https://wiki.postgresql.org/wiki/Retrieve_primary_key_columns) abfragen:Wie für eine Tabelle der Primärschlüssel in Redshift

SELECT a.attname, format_type(a.atttypid, a.atttypmod) AS data_type 
FROM pg_index i 
JOIN pg_attribute a ON a.attrelid = i.indrelid 
        AND a.attnum = ANY(i.indkey) 
WHERE i.indrelid = 'tablename'::regclass 
AND i.indisprimary; 

Leider scheint es nicht in Redshift zu arbeiten. Und ich bekomme diesen Fehler:

ERROR: op ANY/ALL (array) requires array on right side 

Mache ich etwas falsch oder ist das noch eine Rotverschiebung Anomalie?

Jede Hilfe würde sehr geschätzt werden.

+0

welche Postgres Version verwenden Sie? Außerdem: In welcher Tabelle suchen Sie den Index? – perzsa

Antwort

1

Redshift das Konzept der Primärschlüssel nicht http://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html aber Identität attritube verwendet Einzigartigkeit einstellen werden müssen. (Mehr Infos unter http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html)

Detaillierte Informationen zu vorhandenen Tabellen können Sie die folgende Abfrage

select column_name, is_nullable, data_type, character_maximum_length 
from information_schema.columns 
where table_schema='schema_name' 
and table_name='table_name' 
order by ordinal_position 
+1

re "Redshift hat nicht das Konzept der Primärschlüssel" das ist nicht wahr; Sie werden nur nicht erzwungen, aber die Seite, auf die Sie verlinken, empfiehlt Ihnen, sie zu definieren. – chorbs

0

mit Hilfe dieses einen Versuchen: https://bitbucket.org/zzzeek/sqlalchemy/pull-request/6/sqlalchemy-to-support-postgresql-80/diff

SELECT attname column_name, attnotnull, 
    format_type(atttypid, atttypmod) as column_type, atttypmod, 
    i.indisprimary as primary_key, 
    col_description(attrelid, attnum) as description 
FROM pg_attribute c 
    LEFT OUTER JOIN pg_index i 
    ON c.attrelid = i.indrelid AND i.indisprimary AND 
    c.attnum = ANY(string_to_array(textin(int2vectorout(i.indkey)), ' ')) 
where c.attnum > 0 AND NOT c.attisdropped AND c.attrelid = :tableOid 
order by attnum 
1
Redshift doesn't have the concept of primary keys http://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html but identity attritube can be used to set uniqueness. (more info at http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html) 

verwenden Das ist nicht wahr.

Redshift erzwingt keine Primärschlüsseleinschränkungen, sie können jedoch anderweitig verwendet werden. Sie können bei der Automatisierung von Datenpipelines oder Datenqualitätsprüfungen hilfreich sein. Sie werden auch von redshift empfohlen, wenn Sie Sternschemas entwerfen, da sie vom Abfrageoptimierer als Hinweise verwendet werden. https://aws.amazon.com/blogs/big-data/optimizing-for-star-schemas-and-interleaved-sorting-on-amazon-redshift/

Hier ist eine Möglichkeit, eine Tabelle Primärschlüssel zu erhalten:

SELECT Schemanamen, ersetzen (substr (DDL, POSITION ('(' IN DDL) +1), ')', '') primary_key FROM admin.v_generate_tbl_ddl WHERE schemaname = 'Schema' UND Tabellenname = 'Tabelle' UND oberer (ddl) LIKE '% PRIMARY%';

Der Code für die Ansicht "admin.v_generate_tbl_ddl" ist hier: https://github.com/awslabs/amazon-redshift-utils/tree/master/src/AdminViews