Re: Buscando los unique

From: Stephen Amell <StephenAmell(at)inbox(dot)lv>
To: Hellmuth Vargas <hivs77(at)gmail(dot)com>
Cc: "pgsql-es-ayuda(at)lists(dot)postgresql(dot)org" <pgsql-es-ayuda(at)lists(dot)postgresql(dot)org>
Subject: Re: Buscando los unique
Date: 2017-09-22 14:05:17
Message-ID: 839500fe-d956-84f2-bfc2-7492df5b1d68@inbox.lv
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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<StephenAmell(at)inbox(dot)lv <mailto:StephenAmell(at)inbox(dot)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
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Maximi89 2017-09-22 14:18:30 Re: Unsubscribe
Previous Message ๏̯͡๏ Guido Barosio 2017-09-22 13:58:04 Re: