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