Обсуждение: how to update table to make dup values distinct

Поиск
Список
Период
Сортировка

how to update table to make dup values distinct

От
george young
Дата:
[PostgreSQL 7.4RC2 on i686-pc-linux-gnu](I know, I know... must upgrade soon)

I have a table mytable like:i |  txt  
---+-------1 | the2 | the3 | rain4 | in5 | mainly6 | spain7 | stays8 | mainly9 | in

I want to update it, adding a ':' to txt so that each txt value is unique.
I don't care which entry gets changed.  I tried:
update mytable set txt=mytable.txt || ':' from mytable t2 where mytable.txt=t2.txt and mytable.i=t2.i;

but this updated both duplicated entries.  

Um, there may sometimes be 3 or 4 duplicates, not just two.  For these, I can add multiple colons, or one each of an
assortmentof characters, say ':+*&^#'.
 

Performance does not matter here.  The real table has 30K rows, ~200 dups.
To clarify, I want to end up with something like:
1 | the2 | the:3 | rain4 | in5 | mainly:6 | spain7 | stays8 | mainly9 | in:

-- George
-- 
"Are the gods not just?"  "Oh no, child.
What would become of us if they were?" (CSL)


Re: how to update table to make dup values distinct

От
Bruno Wolff III
Дата:
On Thu, Nov 10, 2005 at 10:58:18 -0500, george young <gry@ll.mit.edu> wrote:
> [PostgreSQL 7.4RC2 on i686-pc-linux-gnu](I know, I know... must upgrade soon)
> 
> I have a table mytable like:
>  i |  txt  
> ---+-------
>  1 | the
>  2 | the
>  3 | rain
>  4 | in
>  5 | mainly
>  6 | spain
>  7 | stays
>  8 | mainly
>  9 | in
> 
> I want to update it, adding a ':' to txt so that each txt value is unique.
> I don't care which entry gets changed.  I tried:

This seems like an odd way to fix whatever problem you are having.

Assuming you really do want to go through with this, you can use oids to
distinguish rows. For example you could add a colon to the row with the
lowest oid for each repeated string, and keep doing that until you have them
all fixed.


Re: how to update table to make dup values distinct

От
Harald Fuchs
Дата:
In article <20051110105818.4dc51e8c.gry@ll.mit.edu>,
george young <gry@ll.mit.edu> writes:

> [PostgreSQL 7.4RC2 on i686-pc-linux-gnu](I know, I know... must upgrade soon)
> I have a table mytable like:
>  i |  txt  
> ---+-------
>  1 | the
>  2 | the
>  3 | rain
>  4 | in
>  5 | mainly
>  6 | spain
>  7 | stays
>  8 | mainly
>  9 | in

> I want to update it, adding a ':' to txt so that each txt value is unique.
> I don't care which entry gets changed.  I tried:

>  update mytable set txt=mytable.txt || ':' from mytable t2 where mytable.txt=t2.txt and mytable.i=t2.i;

> but this updated both duplicated entries.  

> Um, there may sometimes be 3 or 4 duplicates, not just two.  For these, I can add multiple colons, or one each of an
assortmentof characters, say ':+*&^#'.
 

> Performance does not matter here.  The real table has 30K rows, ~200 dups.
> To clarify, I want to end up with something like:

>  1 | the
>  2 | the:
>  3 | rain
>  4 | in
>  5 | mainly:
>  6 | spain
>  7 | stays
>  8 | mainly
>  9 | in:

Try the following:
 UPDATE mytable SET txt = txt || substring ('::::::::::::::::' for (     SELECT count(*)     FROM mytable t1     WHERE
t1.txt= mytable.txt AND t1.i < mytable.i   )::int)