Обсуждение: how to update table to make dup values distinct
[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)
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.
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)