Skip site navigation (1) Skip section navigation (2)

Foreign Keys deduplizieren

From: Tobias Bußmann <e(dot)t(dot)bussmann(at)ing(dot)twinwave(dot)net>
To: <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: Foreign Keys deduplizieren
Date: 2010-08-26 12:21:15
Message-ID: 027801cb4519$2ff93030$0164a8c0@LaptopTB (view raw or flat)
Thread:
Lists: pgsql-de-allgemein
Hallo list,

ich habe ein kleines Problem, wo ich gerne von eurer Erfahrung profitieren
würde:

Angenommen ich habe eine Tabelle kunden (kunden_id SERIAL PRIMARY KEY,
kunden_name VARCHAR). Dazu habe ich eine Vielzahl von anderen Tabellen wie
z.B. rechnungen (rechnungs_id SERIAL PRIMARY KEY, kunden_id INTEGER,
rechnungs_nummer VARCHAR), die auf kunden.kunden_id als Forein Key
referenzieren. Diese Foreign Keys sind alle als ON UPDATE CASCADE und ON
DELETE CASCADE konfiguriert.

Nun habe ich das Problem, dass ich in der kunden Tabelle (sematische)
Duplikate habe, die ich gerne aufräumen / dedupliziern möchte. Ich habe also
zwei kunden_ids, die ich zu einer mergen möchte, dazu müssen natürlich auch
alle Verweise auf diesen Kunden angepasst werden. Wie gehe ich das am besten
an? Löschen kann ich den einen nicht, da er dann die auf ihn verweisenden
Records in den anderen Tabellen mitlöscht. Updaten auf die ID des anderen
kann ich auch nicht, da ich dann natürlich ein duplicate key in kunden
bekomme.

Mein Ansatz sieht derzeit vor, mir eine PL/pgSQL Funktion zum mergen zu
schreiben, die sich über das information_schema alle Tabellen, die auf
kunden.kunden_id referenzieren raussucht, dort entsprechende UPDATEs auf die
eine ID vornimmt und dann die andere ID aus kunden löscht.
Eine andere Idee könnte sein, irgendwas mit DEFERABLE Foreign Keys innerhalb
einer Transaktion zu machen aber ich weiss nicht genau wie.

Gibt es hierfür ein 'best practice'?

Danke schon mal
Tobias


pgsql-de-allgemein by date

Next:From: Andreas 'ads' ScherbaumDate: 2010-08-30 20:45:54
Subject: == Wöchentlicher PostgreSQL Newsletter - 29. August 2010 ==
Previous:From: Michael RennerDate: 2010-08-24 13:36:55
Subject: Re: OpenRheinRuhr 2010

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group