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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-de-allgemein by date

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