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
>
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: |