AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Records mit einem Unique Key in Lücke aufrücken lassen

Records mit einem Unique Key in Lücke aufrücken lassen

Ein Thema von QuickAndDirty · begonnen am 30. Dez 2022 · letzter Beitrag vom 17. Apr 2023
Antwort Antwort
Seite 1 von 2  1 2   
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.058 Beiträge
 
Delphi 12 Athens
 
#1

AW: Records mit einem Unique Key in Lücke aufrücken lassen

  Alt 10. Mär 2023, 14:08
Es wird benutzt um Positions-Dubletten innehalb einer Gruppe zu verhindern. Jeder Datensatz hat eine eindeutige ID.....der Primärschlüssel halt .
Ich wusste nicht das diese Funktionalität von Schlüsseln ein Missbrauch ist. Dachte an sich immer, dass es weitverbreitete Praxis ist.
Andreas
Nobody goes there anymore. It's too crowded!
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.136 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Records mit einem Unique Key in Lücke aufrücken lassen

  Alt 11. Mär 2023, 06:31
Wie können beim Löschen Dubletten auftreten?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.375 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Records mit einem Unique Key in Lücke aufrücken lassen

  Alt 13. Mär 2023, 09:19
Ich glaube fast, dass es hier ein generelles Missverständnis gibt.
Der PK ist das Feld "ID".
Dann gibt es zusätzlich eine GruppenID und eine Position, die in Kombination ein UK sind.
Wenn ich dabei an eine WaWi denke, könnte GruppenID eine Auftragsnummer sein und Position die laufende Positionsnummer.
Löscht man eine der Position (z.B. Nr 3 von 500), möchte man die Positionsnummern neu vergeben, damit keine Lücken entstehen.
Die Aussage, dass das eine Prüfung der Dubletten sein soll, ist vermutlich unglücklich formuliert. Ich gehe davon aus, dass durch den kombinierten UK doppelte Positionsnummern in einem "Auftrag" bei der Erfassung verhindert werden sollen. Es stellt sich dabei natürlichdie Frage, wie das passieren sollte, da man üblicherweise Positionsnummern nicht manuell vergibt, aber das ist ein anderes Thema.

Firebird kennt "with" und das gilt inzwischen eigentlich für alle aktuellen Datenbanken.
Nimmt man in das With eine sortierte SQL-Abfrage und joined das im Update-Statement, kann man vermutlich die Positionen neu durchnummerieren.
Bitte selbst testen, da es nicht schwierig ist und ich auch kein Firebird zur Verfügung habe, um das zu prüfen.
Peter
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.058 Beiträge
 
Delphi 12 Athens
 
#4

AW: Records mit einem Unique Key in Lücke aufrücken lassen

  Alt 17. Mär 2023, 11:07
Ich glaube fast, dass es hier ein generelles Missverständnis gibt.
Der PK ist das Feld "ID".
Dann gibt es zusätzlich eine GruppenID und eine Position, die in Kombination ein UK sind.
Wenn ich dabei an eine WaWi denke, könnte GruppenID eine Auftragsnummer sein und Position die laufende Positionsnummer.
Löscht man eine der Position (z.B. Nr 3 von 500), möchte man die Positionsnummern neu vergeben, damit keine Lücken entstehen.
Die Aussage, dass das eine Prüfung der Dubletten sein soll, ist vermutlich unglücklich formuliert. Ich gehe davon aus, dass durch den kombinierten UK doppelte Positionsnummern in einem "Auftrag" bei der Erfassung verhindert werden sollen. Es stellt sich dabei natürlichdie Frage, wie das passieren sollte, da man üblicherweise Positionsnummern nicht manuell vergibt, aber das ist ein anderes Thema.

Firebird kennt "with" und das gilt inzwischen eigentlich für alle aktuellen Datenbanken.
Nimmt man in das With eine sortierte SQL-Abfrage und joined das im Update-Statement, kann man vermutlich die Positionen neu durchnummerieren.
Bitte selbst testen, da es nicht schwierig ist und ich auch kein Firebird zur Verfügung habe, um das zu prüfen.
Ich lese mir mal "With" durch!
Andreas
Nobody goes there anymore. It's too crowded!
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.058 Beiträge
 
Delphi 12 Athens
 
#5

AW: Records mit einem Unique Key in Lücke aufrücken lassen

  Alt 17. Mär 2023, 11:16
Wie können beim Löschen Dubletten auftreten?
Beim Löschen keine!
Beim Aufrücken in die freie Position kann das passieren je nach dem in welcher reihenfolge der SQLServer die Datensätze bearbeitet.
Code:
UPDATE "TABELLE" SET "ZEILENPOSITION" = "ZEILENPOSITION" -1
Wenn UPDATE zuerst Datensätze mit der kleinsten "ZEILENPOSITION" bearbeitet dann haben wir keine Doubletten
Wenn UPDATE aber mit einer Anderen "ZEILENPOSITION" beginnt als mit der Kleinsten, dann havben wir temporär Doubletten und die UNIQUE KEY CONSTRAINT schlägt zu.
Andreas
Nobody goes there anymore. It's too crowded!
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.599 Beiträge
 
Delphi 7 Professional
 
#6

AW: Records mit einem Unique Key in Lücke aufrücken lassen

  Alt 17. Mär 2023, 12:01
Hier gibt es mehrere Vorschläge, die eventuell hilfreich sein könnten: How to update and order by using ms sql
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.493 Beiträge
 
Delphi 12 Athens
 
#7

AW: Records mit einem Unique Key in Lücke aufrücken lassen

  Alt 18. Mär 2023, 07:58
So ein Sortierfeld ist in den meisten Fällen vom Typ Integer, aber enthält nur positive Werte.
Damit während des Sortiervorgangs ein eindeutiger Index auf diesem Feld nicht verletzt wird, kann man den Vorgang innerhalb einer Transaktion in zwei Schritte aufteilen:
- für allen zu veränderden Datensätzen den vorhandenen Wert negierten
- die negierten Werte durch die neuen positiven Werte ersetzen
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
637 Beiträge
 
Delphi XE6 Enterprise
 
#8

AW: Records mit einem Unique Key in Lücke aufrücken lassen

  Alt 20. Mär 2023, 13:43
So ein Sortierfeld ist in den meisten Fällen vom Typ Integer, aber enthält nur positive Werte.
Damit während des Sortiervorgangs ein eindeutiger Index auf diesem Feld nicht verletzt wird, kann man den Vorgang innerhalb einer Transaktion in zwei Schritte aufteilen:
- für allen zu veränderden Datensätzen den vorhandenen Wert negierten
- die negierten Werte durch die neuen positiven Werte ersetzen
Oder im ersten Schritt eine große Konstante (z.B. 1.000.000) auf alle Nummern aufaddieren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.557 Beiträge
 
Delphi 12 Athens
 
#9

AW: Records mit einem Unique Key in Lücke aufrücken lassen

  Alt 20. Mär 2023, 15:30
Oder die ID eine ID sein lassen und ein anderes Feld zum Sortieren benutzen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.058 Beiträge
 
Delphi 12 Athens
 
#10

AW: Records mit einem Unique Key in Lücke aufrücken lassen

  Alt 17. Apr 2023, 10:47
So ein Sortierfeld ist in den meisten Fällen vom Typ Integer, aber enthält nur positive Werte.
Damit während des Sortiervorgangs ein eindeutiger Index auf diesem Feld nicht verletzt wird, kann man den Vorgang innerhalb einer Transaktion in zwei Schritte aufteilen:
- für allen zu veränderden Datensätzen den vorhandenen Wert negierten
- die negierten Werte durch die neuen positiven Werte ersetzen
Ja, das war ja auch mein erster weg dieses Problem zu lösen. Siehe beispiel im Eröffnungspost.
Ich wollte nur wissen ob es bessere Wege gibt.
Andreas
Nobody goes there anymore. It's too crowded!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz