pk con valores duplicados

Lists: pgsql-es-ayuda
From: Oswaldo Hernández <listas(at)soft-com(dot)es>
To: Lista Postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: pk con valores duplicados
Date: 2009-05-20 20:56:22
Message-ID: 4A146E76.8090401@soft-com.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Hola de nuevo,

Revisando la base de datos en version 7.4 que comentaba en mensajes anteriores, vacuumdb me sugiere
que haga reindex sobre varios de los indices de la base de datos.

Al realizar reindex en algunos de ellos aparece el siguiente error:

ERROR: could not create unique index
DETAIL: Table contains duplicated values.

Viendo una de las tablas que provoca el error veo que efectivamente tiene valores duplicados en un
campo con indice unique:

caoba=# select oid, cod_clientecentral from clientecentrales where oid = 15894351;
oid | clientecentral
----------+--------------------
15894351 | 12481
15894351 | 12481
(2 rows)

Esta tabla tiene definida la primary key como:
CONSTRAINT clic_pk_cod_clientecentral PRIMARY KEY (cod_clientecentral)

Evidentemente hay que eliminar uno de los registros, pero me surgen la siguientes dudas sobre como
hacerlo:

. La columna clientecentral esta referenciada con fk desde otras tablas, si elimino uno de los
registros y aunque quede el otro con los mismos valores ¿se dispararán la fk y se eliminarán los
registros referenciados?

. pg_dump vuelca ambos registros. ¿Seria mas conveniente eliminar el registro sobrante en el dump y
restaurar la base de datos sin los valores duplicados?

Agradezco cualquer sugerencia.

--
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
PD:
Antes de imprimir este mensaje, asegúrese de que es necesario.
El medio ambiente está en nuestra mano.


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Oswaldo Hernández <listas(at)soft-com(dot)es>
Cc: Lista Postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: pk con valores duplicados
Date: 2009-05-20 21:06:57
Message-ID: 20090520210657.GI5368@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Oswaldo Hernández escribió:

> Viendo una de las tablas que provoca el error veo que efectivamente tiene
> valores duplicados en un campo con indice unique:

> Evidentemente hay que eliminar uno de los registros, pero me surgen la
> siguientes dudas sobre como hacerlo:

Lo más fácil es usar el ctid:

select ctid, cod_clientecentral from ...

Luego DELETE FROM ... WHERE ctid = 'valor a borrar'

> . La columna clientecentral esta referenciada con fk desde otras tablas,
> si elimino uno de los registros y aunque quede el otro con los mismos
> valores ¿se dispararán la fk y se eliminarán los registros referenciados?

No, es decir sí pero van a ver el otro (¿no tienes FKs CASCADE verdad?)

> . pg_dump vuelca ambos registros. ¿Seria mas conveniente eliminar el
> registro sobrante en el dump y restaurar la base de datos sin los valores
> duplicados?

No necesariamente ...

--
Alvaro Herrera http://www.amazon.com/gp/registry/DXLWNGRJD34J
"El miedo atento y previsor es la madre de la seguridad" (E. Burke)


From: Oswaldo Hernández <listas(at)soft-com(dot)es>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Lista Postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: pk con valores duplicados
Date: 2009-05-20 21:23:54
Message-ID: 4A1474EA.4040607@soft-com.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Alvaro Herrera escribió:
> Oswaldo Hernández escribió:
>
>> Viendo una de las tablas que provoca el error veo que efectivamente tiene
>> valores duplicados en un campo con indice unique:
>
>
>> Evidentemente hay que eliminar uno de los registros, pero me surgen la
>> siguientes dudas sobre como hacerlo:
>
> Lo más fácil es usar el ctid:
>
> select ctid, cod_clientecentral from ...

OK, funciona bien y no esta duplicado como el OID.

> Luego DELETE FROM ... WHERE ctid = 'valor a borrar'
>
>> . La columna clientecentral esta referenciada con fk desde otras tablas,
>> si elimino uno de los registros y aunque quede el otro con los mismos
>> valores ¿se dispararán la fk y se eliminarán los registros referenciados?
>
> No, es decir sí pero van a ver el otro (¿no tienes FKs CASCADE verdad?)

Las que he analizado no tienen FKs CASCADE, pero no las he visto todas, son 6 o 7 tablas con duplicados.

>
>> . pg_dump vuelca ambos registros. ¿Seria mas conveniente eliminar el
>> registro sobrante en el dump y restaurar la base de datos sin los valores
>> duplicados?
>
> No necesariamente ...
>

Mañana hare las pruebas (aqui ya es tarde) y enviaré el resultado.

Gracias.

--
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
PD:
Antes de imprimir este mensaje, asegúrese de que es necesario.
El medio ambiente está en nuestra mano.