2009-07-28 6 views
1

Dans une application existante, j'ai une table qui n'a pas de clé primaire, qui contient (rarement) des lignes dupliquées. Pour l'intégration avec un autre système, j'ai besoin d'ajouter une colonne à la table qui rend ces lignes dupliquées uniques. Le tableau est essentiellement:Postgres ajoute seq # pour distinguer les lignes uniques dans la base de données

 
+------+---------+--------+ 
| txn# | detail# | amount | 
+------+---------+--------+ 

je pouvais utiliser un #SEQ incrémenter pour chaque ligne existante, cependant, les changements d'application sera de prendre l'actuel « presque clé » (essentiellement transaction # détail #), et l'incrément le numéro de séquence pour cette combinaison (ainsi, par exemple, je vais avoir deux lignes pour txn # 1, détail # 1, et avoir seq # 1 pour le premier et seq # 2 pour le second, et si txn # 513, détail # 44 a 3 lignes dupliquées, celles-ci auraient la séquence # 1,2,3 de façon appropriée, ce qui serait idéal (du point de vue du support), si les modifications de données avant et après l'application étaient également présentées. créer cette colonne, ou dois-je faire défiler les lignes manuellement, en réinitialisant la séquence utilisée chaque fois que le # txn # ou le détail # change?

modifié pour ajouter: l'application est déployée sur Postgresql 7.4 & 8.1, et la solution doit fonctionner pour les deux versions.

Répondre

1

Si vos colonnes sont "presque unique", i. e. il n'y a pas beaucoup de doubles de chaque valeur, vous pouvez utiliser cette syntaxe:

ALTER TABLE mytable ADD seq INT; 

UPDATE mytable mo 
SET  seq = 
     (
     SELECT COUNT(*) 
     FROM mytable mi 
     WHERE mi.txn = mo.txn 
       AND mi.detail = mo.detail 
       AND mi.ctid <= mo.ctid 
     ) 

ALTER TABLE mytable ALTER COLUMN seq SET NOT NULL; 

ALTER TABLE mytable DROP CONSTRAINT t_mytable_pkey; -- the name of your current primary key 

ALTER TABLE mytable ADD CONSTRAINT t_mytable_pkey PRIMARY KEY (txn, detail, seq); 

Cela complétera rapide, s'il n'y a pas trop de doublons.

+0

Merci, la chose ctid était la partie manquante du puzzle pour moi! –

Questions connexes