On Thu, May 11, 2017 at 9:24 AM, Igor Korot <ikoro...@gmail.com> wrote:

> Melvin et al,
>
> On Thu, May 11, 2017 at 8:50 AM, Melvin Davidson <melvin6...@gmail.com>
> wrote:
>
>>
>> On Wed, May 10, 2017 at 11:26 PM, Igor Korot <ikoro...@gmail.com> wrote:
>>
>>> Hi, John et al,
>>>
>>> On Wed, May 10, 2017 at 11:02 PM, John R Pierce <pie...@hogranch.com>
>>> wrote:
>>> > On 5/10/2017 7:45 PM, Igor Korot wrote:
>>> >>
>>> >> I found
>>> >> this:https://wiki.postgresql.org/wiki/Retrieve_primary_key_columns,
>>> >> but now I need
>>> >> to connect this with information_schema.columns.
>>> >>
>>> >> What is best way to do it?
>>> >>
>>> >> Or maybe that query I referenced is completely wrong?
>>> >
>>> >
>>> >
>>> > if you're using pg_catalog stuff there's little point in using the
>>> > information_schema views, which exist for compatability with the SQL
>>> > standard.
>>> >
>>> > information_schema.columns is a view, like...
>>>
>>> Like I said, what I expect to see from the query is:
>>>
>>> id | integer | | 5| 2 | 0 | P |
>>> name | varchar | 50| 2 | | | | <NULL>
>>>
>>> So I need the information about the field and whether the field is a
>>> primary/foreign key or not.
>>>
>>> And this is according to the schema.table.
>>>
>>> Thank you.
>>>
>>> >
>>> > View definition:
>>> >  SELECT current_database()::information_schema.sql_identifier AS
>>> > table_catalog,
>>> >     nc.nspname::information_schema.sql_identifier AS table_schema,
>>> >     c.relname::information_schema.sql_identifier AS table_name,
>>> >     a.attname::information_schema.sql_identifier AS column_name,
>>> >     a.attnum::information_schema.cardinal_number AS ordinal_position,
>>> >     pg_get_expr(ad.adbin, ad.adrelid)::information_schema.character_data
>>> AS
>>> > column_default,
>>> >         CASE
>>> >             WHEN a.attnotnull OR t.typtype = 'd'::"char" AND
>>> t.typnotnull
>>> > THEN 'NO'::text
>>> >             ELSE 'YES'::text
>>> >         END::information_schema.yes_or_no AS is_nullable,
>>> >         CASE
>>> >             WHEN t.typtype = 'd'::"char" THEN
>>> >             CASE
>>> >                 WHEN bt.typelem <> 0::oid AND bt.typlen = (-1) THEN
>>> > 'ARRAY'::text
>>> >                 WHEN nbt.nspname = 'pg_catalog'::name THEN
>>> > format_type(t.typbasetype, NULL::integer)
>>> >                 ELSE 'USER-DEFINED'::text
>>> >             END
>>> >             ELSE
>>> >             CASE
>>> >                 WHEN t.typelem <> 0::oid AND t.typlen = (-1) THEN
>>> > 'ARRAY'::text
>>> >                 WHEN nt.nspname = 'pg_catalog'::name THEN
>>> > format_type(a.atttypid, NULL::integer)
>>> >                 ELSE 'USER-DEFINED'::text
>>> >             END
>>> >         END::information_schema.character_data AS data_type,
>>> > information_schema._pg_char_max_length(information_schema._p
>>> g_truetypid(a.*,
>>> > t.*), information_schema._pg_truetypmod(a.*,
>>> > t.*))::information_schema.cardinal_numb
>>> > er AS character_maximum_length,
>>> > information_schema._pg_char_octet_length(information_schema.
>>> _pg_truetypid(a.*,
>>> > t.*), information_schema._pg_truetypmod(a.*,
>>> > t.*))::information_schema.cardinal_nu
>>> > mber AS character_octet_length,
>>> > information_schema._pg_numeric_precision(information_schema.
>>> _pg_truetypid(a.*,
>>> > t.*), information_schema._pg_truetypmod(a.*,
>>> > t.*))::information_schema.cardinal_nu
>>> > mber AS numeric_precision,
>>> > information_schema._pg_numeric_precision_radix(information_s
>>> chema._pg_truetypid(a.*,
>>> > t.*), information_schema._pg_truetypmod(a.*,
>>> t.*))::information_schema.cardi
>>> > nal_number AS numeric_precision_radix,
>>> > information_schema._pg_numeric_scale(information_schema._pg_
>>> truetypid(a.*,
>>> > t.*), information_schema._pg_truetypmod(a.*,
>>> > t.*))::information_schema.cardinal_number
>>> >  AS numeric_scale,
>>> > information_schema._pg_datetime_precision(information_schema
>>> ._pg_truetypid(a.*,
>>> > t.*), information_schema._pg_truetypmod(a.*,
>>> > t.*))::information_schema.cardinal_n
>>> > umber AS datetime_precision,
>>> > information_schema._pg_interval_type(information_schema._pg_
>>> truetypid(a.*,
>>> > t.*), information_schema._pg_truetypmod(a.*,
>>> > t.*))::information_schema.character_data
>>> > AS interval_type,
>>> >     NULL::integer::information_schema.cardinal_number AS
>>> interval_precision,
>>> >     NULL::character varying::information_schema.sql_identifier AS
>>> > character_set_catalog,
>>> >     NULL::character varying::information_schema.sql_identifier AS
>>> > character_set_schema,
>>> >     NULL::character varying::information_schema.sql_identifier AS
>>> > character_set_name,
>>> >         CASE
>>> >             WHEN nco.nspname IS NOT NULL THEN current_database()
>>> >             ELSE NULL::name
>>> >         END::information_schema.sql_identifier AS collation_catalog,
>>> >     nco.nspname::information_schema.sql_identifier AS
>>> collation_schema,
>>> >     co.collname::information_schema.sql_identifier AS collation_name,
>>> >         CASE
>>> >             WHEN t.typtype = 'd'::"char" THEN current_database()
>>> >             ELSE NULL::name
>>> >         END::information_schema.sql_identifier AS domain_catalog,
>>> >         CASE
>>> >             WHEN t.typtype = 'd'::"char" THEN nt.nspname
>>> >             ELSE NULL::name
>>> >         END::information_schema.sql_identifier AS domain_schema,
>>> >         CASE
>>> >             WHEN t.typtype = 'd'::"char" THEN t.typname
>>> >             ELSE NULL::name
>>> >         END::information_schema.sql_identifier AS domain_name,
>>> >     current_database()::information_schema.sql_identifier AS
>>> udt_catalog,
>>> >     COALESCE(nbt.nspname, nt.nspname)::information_schema.sql_identifier
>>> AS
>>> > udt_schema,
>>> >     COALESCE(bt.typname, t.typname)::information_schema.sql_identifier
>>> AS
>>> > udt_name,
>>> >     NULL::character varying::information_schema.sql_identifier AS
>>> > scope_catalog,
>>> >     NULL::character varying::information_schema.sql_identifier AS
>>> > scope_schema,
>>> >     NULL::character varying::information_schema.sql_identifier AS
>>> > scope_name,
>>> >     NULL::integer::information_schema.cardinal_number AS
>>> > maximum_cardinality,
>>> >     a.attnum::information_schema.sql_identifier AS dtd_identifier,
>>> >     'NO'::character varying::information_schema.yes_or_no AS
>>> > is_self_referencing,
>>> >     'NO'::character varying::information_schema.yes_or_no AS
>>> is_identity,
>>> >     NULL::character varying::information_schema.character_data AS
>>> > identity_generation,
>>> >     NULL::character varying::information_schema.character_data AS
>>> > identity_start,
>>> >     NULL::character varying::information_schema.character_data AS
>>> > identity_increment,
>>> >     NULL::character varying::information_schema.character_data AS
>>> > identity_maximum,
>>> >     NULL::character varying::information_schema.character_data AS
>>> > identity_minimum,
>>> >     NULL::character varying::information_schema.yes_or_no AS
>>> identity_cycle,
>>> >     'NEVER'::character varying::information_schema.character_data AS
>>> > is_generated,
>>> >     NULL::character varying::information_schema.character_data AS
>>> > generation_expression,
>>> >         CASE
>>> >             WHEN c.relkind = 'r'::"char" OR (c.relkind = ANY
>>> > (ARRAY['v'::"char", 'f'::"char"])) AND
>>> > pg_column_is_updatable(c.oid::regclass, a.attnum, false) THEN 'YE
>>> > S'::text
>>> >             ELSE 'NO'::text
>>> >         END::information_schema.yes_or_no AS is_updatable
>>> >    FROM pg_attribute a
>>> >      LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum =
>>> > ad.adnum
>>> >      JOIN (pg_class c
>>> >      JOIN pg_namespace nc ON c.relnamespace = nc.oid) ON a.attrelid =
>>> c.oid
>>> >      JOIN (pg_type t
>>> >      JOIN pg_namespace nt ON t.typnamespace = nt.oid) ON a.atttypid =
>>> t.oid
>>> >      LEFT JOIN (pg_type bt
>>> >      JOIN pg_namespace nbt ON bt.typnamespace = nbt.oid) ON t.typtype =
>>> > 'd'::"char" AND t.typbasetype = bt.oid
>>> >      LEFT JOIN (pg_collation co
>>> >      JOIN pg_namespace nco ON co.collnamespace = nco.oid) ON
>>> a.attcollation
>>> > = co.oid AND (nco.nspname <> 'pg_catalog'::name OR co.collname <>
>>> > 'default'::name)
>>> >   WHERE NOT pg_is_other_temp_schema(nc.oid) AND a.attnum > 0 AND NOT
>>> > a.attisdropped AND (c.relkind = ANY (ARRAY['r'::"char", 'v'::"char",
>>> > 'f'::"char"])) AND (pg_has_
>>> > role(c.relowner, 'USAGE'::text) OR has_column_privilege(c.oid,
>>> a.attnum,
>>> > 'SELECT, INSERT, UPDATE, REFERENCES'::text));
>>> >
>>> >
>>> >
>>> > --
>>> > john r pierce, recycling bits in santa cruz
>>> >
>>> >
>>> >
>>> >
>>> > --
>>> > Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
>>> > To make changes to your subscription:
>>> > http://www.postgresql.org/mailpref/pgsql-general
>>>
>>>
>>> --
>>> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
>>> To make changes to your subscription:
>>> http://www.postgresql.org/mailpref/pgsql-general
>>>
>>
>>
>>
>> *Igor,*
>>
>> *as others have suggested, you would be better off querying the system
>> catalogs to get constraint information. The query below is what I use.*
>>
>> *Perhaps it will help you modify to your needs.*
>>
>
> I understand that.
>
> Trouble is that at the same time I need the complete information about all
> columns in the table.
> And as far as I can see tis info is available in
> information_schema.columns table/view.
>
> Now are you saying that the information about the fields in the table can
> be retrieved from
> system catalog? Or are you saying that retrieving everything in one shot
> is not possible?
>
> Thank you.
>
>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> *SELECT cn.conname,       CASE WHEN cn.contype = 'c' THEN 'check'
>>             WHEN cn.contype = 'f' THEN 'foreign key'            WHEN
>> cn.contype = 'p' THEN 'primary key'            WHEN cn.contype = 'u' THEN
>> 'unique'            WHEN cn.contype = 't' THEN 'trigger'            WHEN
>> cn.contype = 'x' THEN 'exclusion'       END as type,
>> cn.condeferrable,       CASE WHEN cn.conrelid > 0             THEN (SELECT
>> nspname || '.' || relname                    FROM pg_class
>> c                   JOIN pg_namespace n ON n.oid =
>> c.relnamespace                  WHERE c.oid = cn.conrelid)            ELSE
>> ''       END as table,       confkey,       consrc     FROM pg_constraint
>> cn ORDER BY 1;*
>>
>> --
>> *Melvin Davidson*
>> I reserve the right to fantasize.  Whether or not you
>> wish to share my fantasy is entirely up to you.
>>
>
>


*>Now are you saying that the information about the fields in the table can
be retrieved from system catalog? *

*Absolutely, Yes. Information_schema is nothing more than views of the
system catalogs!*

*The information about columns is in pg_attribute. Please focus your
attention on the documentation for*

*system catalogs.  https://www.postgresql.org/docs/9.6/static/catalogs.html
<https://www.postgresql.org/docs/9.6/static/catalogs.html>*

-- 
*Melvin Davidson*
I reserve the right to fantasize.  Whether or not you
wish to share my fantasy is entirely up to you.

Reply via email to