doppeleinträge finden - wie?

ich habe eine tabelle in der form

tab1
spalte_A spalte_B

22 bla
88 fasel

  1. Wie krieg am sinnvollsten doppelte Einträge aus dieser Tabelle raus?

  2. Ich will keine Doppeleinträge in der Tabelle. Ich habs mit einem Index versucht - da krieg ich aber ein Problem: Es kommt immer wieder vor, dass innerhalb einer Transaktion ein Doppeleintrag in die Tabelle geschrieben wird - die Transaktion scheitert dann komplett.

Nun weiss ich nicht recht weiter. Gibt es eine elegante und performate Möglichkeit, Doppeleinträge abzufangen?

Das einzige was mir im Moment einfällt, wäre die ganze Transaktion (die nur aus Geschwindigkeitsgründen gesammelt ist) Zeilenweise zu splitten und mit einem Uniq-Index auf beide Spalten zu arbeiten.

thomas

Hallo Thomas,

  1. Für die Transaktion nur Einträge zulassen, die noch nicht in der Tabelle vorhanden sind.

  2. Konzept überdenken.

  3. Ursache für die doppelten Einträge beseitigen!



    mfg

fristo

  1. Für die Transaktion nur Einträge zulassen, die noch nicht in der Tabelle vorhanden sind.

Wie mach ich das?

  1. Ursache für die doppelten Einträge beseitigen!

Die Ursache der Boppeleinträge läßt sich nicht beseitigen, ich kann sie aber im Script vor dem Absetzen der Transaktion abfangen. Das würde einen gewissen Scriptoverhead bedeuten, wird aber vermutlich auch die Lösung sein, wenn das in der DB nicht ohne weiteres abzufangen ist. Lieber wäre mir gewesen, daß die DB diesen seltenen Fall von sich aus abfängt und nur den Doppeleintrag verweigert, ohne den Rest der Transaktion zu verweigern.

tom

Hallo Thomas,

Schau mal auf diese Seite, http://www.pg-forum.de/viewtopic.php?t=180&highlight=, da gibt es Code, wo auch Zeilen ausgeschlossen werden. Andere Möglichkeiten sind mit HAVING oder auch mit JOIN zu arbeiten. Was für Deine Applikation richtig ist, muss Du selbst herausfinden. Die Kenntnis der SQL-Befehle hilft da immer weiter.


Die DB macht nur das, was in den Scripten steht. Und die Transaktion hat auch alles richtig gemacht, bei einem Fehler die Transaktion abgebrochen. Wie willst Du sonst die Konsistens einer DB sicher stellen?



mfg

fristo

Kann PostgreSQL 8.x nicht auch geschachtelte Transaktionen?
Damit könntest Du den Teil, der die Doppelteinträge produziert, in eine eigene Transaktion innerhalb der Transaktion verbannen. Damit würde dann nur dieser Teil fehlschlagen, die äußere Transaktion aber durchlaufen.

Aber als wirklich saubere Lösung empfinde ich das nicht…