Hola Hellmuth / Lista,

   Buenos días,

   Y gracias por su tiempo.

   *Para la primera parte. *Unique como indice.
   **

   CREATE UNIQUE INDEX ix_test_unique_uno ON public.odusdemo (uno ASC
   NULLS LAST);

   insert into public.odusdemo(uno, dos, tres) values ( 3, 'tres', 300 );

   -- Lo esperado:
   ERROR:  llave duplicada viola restricción de unicidad
   «ix_test_unique_uno»
   DETAIL:  Ya existe la llave (uno)=(3).

   select
        s.nspname as schema_name,
        t.relname as table_name,
        i.relname as index_name,
        a.attname as column_name
   from
        pg_class t,
        pg_class i,
        pg_index ix,
        pg_attribute a,
        pg_namespace s
   where
        t.oid = ix.indrelid
        and i.oid = ix.indexrelid
        and a.attrelid = t.oid
        and a.attnum = ANY(ix.indkey)
        and t.relkind = 'r'
        and t.relnamespace=s.oid
        and ix.indisunique and not ix.indisprimary
        and s.nspname='public'
        and t.relname='odusdemo'
         and a.attname='uno';

   -- Lo esperado:

     schema_name | table_name |     index_name     | column_name
   -------------+------------+--------------------+-------------
     public      | odusdemo   | ix_test_unique_uno | uno


   *Para la segunda parte.* Unique como constraint.

   Hice la siguiente prueba, pero me fallaba la parte de la
   comprobacion al preguntar si un campo es parte de un unique ( and
   cc.conname='<columna>' ) así que me puse a darle vueltas y lo cambie
   ( por and a.attname='uno' ).
   Por suerte no fue mas complejo que esto, aunque ahora no encuentro
   la funcion que trae el drop y el create :P


   CREATE TABLE public.odusdemo
   (
      id serial NOT NULL ,
      uno integer,
      dos character varying(50),
      tres integer,
      CONSTRAINT pk PRIMARY KEY (id)
   )
   WITH (
      OIDS=FALSE
   );

   insert into public.odusdemo(uno, dos, tres) values ( 1, 'uno', 100 );
   insert into public.odusdemo(uno, dos, tres) values ( 2, 'dos', 200 );
   insert into public.odusdemo(uno, dos, tres) values ( 3, 'tres', 300 );
   insert into public.odusdemo(uno, dos, tres) values ( 4, 'cuatro', 400 );
   insert into public.odusdemo(uno, dos, tres) values ( 5, 'cinco', 500 );
   insert into public.odusdemo(uno, dos, tres) values ( 6, 'seis', 600 );
   insert into public.odusdemo(uno, dos, tres) values ( 7, 'siete', 700 );
   insert into public.odusdemo(uno, dos, tres) values ( 8, 'ocho', 800 );
   insert into public.odusdemo(uno, dos, tres) values ( 9, 'nueve', 900 );
   insert into public.odusdemo(uno, dos, tres) values ( 0, 'cero', 0 );

   select * from public.odusdemo;

   id | uno |  dos   | tres
   ----+-----+--------+------
      1 |   1 | uno    |  100
      2 |   2 | dos    |  200
      3 |   3 | tres   |  300
      4 |   4 | cuatro |  400
      5 |   5 | cinco  |  500
      6 |   6 | seis   |  600
      7 |   7 | siete  |  700
      8 |   8 | ocho   |  800
      9 |   9 | nueve  |  900
     10 |   0 | cero   |    0
   (10 rows)


   ALTER TABLE public.odusdemo ADD CONSTRAINT uq_test_uno UNIQUE (uno);

   select cc.conrelid::regclass AS table_from,
              confrelid::regclass AS table_to,
              cc.conname, cc.contype,
              pg_get_constraintdef(cc.oid) as definicion
       from pg_catalog.pg_constraint cc
       JOIN pg_namespace n ON n.oid = cc.connamespace
       join pg_catalog.pg_class c on c.oid = cc.conrelid
       join pg_catalog.pg_attribute a on a.attrelid = cc.conrelid
        and a.attnum = any(cc.conkey)
       where
            cc.contype = 'u'
            and n.nspname = 'public'
            and cc.conrelid = 'odusdemo'::regclass
            --and cc.conname='<columna>'
       group by 1,2,3,4,5
       ;

     table_from | table_to |   conname   | contype | definicion
   ------------+----------+-------------+---------+--------------
     odusdemo   | -        | uq_test_uno | u       | UNIQUE (uno)
   (1 row)


   -- Cambio:


   ALTER TABLE public.odusdemo ADD CONSTRAINT uq_test_uno_tres UNIQUE
   (uno, tres);

       select cc.conname nombreuq, pg_get_constraintdef(cc.oid) as
   definicion
       from pg_catalog.pg_constraint cc
       JOIN pg_namespace n ON n.oid = cc.connamespace
       join pg_catalog.pg_class c on c.oid = cc.conrelid
       join pg_catalog.pg_attribute a on a.attrelid = cc.conrelid
        and a.attnum = any(cc.conkey)
       where
            cc.contype = 'u'
            and n.nspname = 'public'
            and cc.conrelid = 'odusdemo'::regclass
            and a.attname='uno'

       ;

   -[ RECORD 1 ]------------------
   nombreuq   | uq_test_uno
   definicion | UNIQUE (uno)
   -[ RECORD 2 ]------------------
   nombreuq   | uq_test_uno_tres
   definicion | UNIQUE (uno, tres)


   Asi que sin mas, Mil gracias por su ayuda!!




On 2017-09-21 15:31, Hellmuth Vargas wrote:
Hola Lista

Los unique se pueden implementar por indices o por constraints, para sacar la lista por los primeros (indice):

select
    s.nspname as schema_name,
    t.relname as table_name,
    i.relname as index_name,
    a.attname as column_name,
    ix.*
from
    pg_class t,
    pg_class i,
    pg_index ix,
    pg_attribute a,
    pg_namespace s
where
    t.oid = ix.indrelid
    and i.oid = ix.indexrelid
    and a.attrelid = t.oid
    and a.attnum = ANY(ix.indkey)
    and t.relkind = 'r'
    and t.relnamespace=s.oid
    and ix.indisunique and not ix.indisprimary
    -- and s.nspname='<schema>'
   --  and t.relname='<tabla>'
   --  and a.attname='<columna>'

para sacar los implementados por constraints:


select cc.conrelid::regclass AS table_from,
 confrelid::regclass AS table_to,
   cc.conname,
                    cc.contype,
 pg_get_constraintdef(cc.oid) as definicion
   from pg_catalog.pg_constraint cc
JOIN pg_namespace n ON n.oid = cc.connamespace
join pg_catalog.pg_class c on c.oid = cc.conrelid
join pg_catalog.pg_attribute a on a.attrelid = cc.conrelid
   and a.attnum = any(cc.conkey)
   where
                    cc.contype = 'u'
                    -- and n.nspname = '<schema>'
    -- and cc.conrelid::regclass = '<tabla>'
                    -- and cc.conname='<columna>'
   group by 1,2,3,4,5




El 21 de septiembre de 2017, 12:50, Stephen Amell<stephenam...@inbox.lv <mailto:stephenam...@inbox.lv>> escribió:

    Buenas tardes Lista!

    Hoy les escribo porque estoy desarrollando un proceso de
    anonimizacion de base de datos, que ya funciona bastante bien por
    cierto, pero tengo un problema que no puedo resolver. Los unique,
    si bien necesito que la tabla tenga PK para funcionar, necesito
    saber si ademas hay otra constraint unique que deba considerar
    (las que tienen el icono del 1 en azul en el pgadmin).

    Dado un campo, de una tabla, de un esquema, de una base ( o sea
    que conozco db.schema.table.campo ), necesito encontrar si este
    campo es parte de alguna constrain, y de ser asi su
    correspondiente drop y create.

    Algo asi:

    Select NombreUQ, DropStr, CreateStr
    >From tabla_magica
    where schema = 'esquema'
    and tabla = 'tabla'
    and campo = 'campo';


    ¿Alguna sugerencia?






--
Cordialmente,

Ing. Hellmuth I. Vargas S.
Esp. Telemática y Negocios por Internet
Oracle Database 10g Administrator Certified Associate
EnterpriseDB Certified PostgreSQL 9.3 Associate


Reply via email to