Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi IDs schnell abändern (https://www.delphipraxis.net/90964-ids-schnell-abaendern.html)

trashcandesign 26. Apr 2007 16:46

Datenbank: Firebird • Version: 1.5 • Zugriff über: ZEOSLib

IDs schnell abändern
 
Moin,

ich hab da mal wieder ein kleines Problemchen.

Ich habe eine Tabelle [ID|Text] mit ca. 11000 Datensätzen und muss nun bei jedem Datensatz die ID abändern.
Im Moment gehe ich mit einer while-Schleife durch jeden Datensatz und änder die ID:
Delphi-Quellcode:
[...]
  while not eof do
  begin
    Edit;    
      FieldByName('ID').AsInteger := iID;
    Post;
     
    inc(iID);
    Next;
  end;
[...]
Diese Methode dauert aber natürlich viel zu lang. :(
Gibt es eine Möglichkeit dieses Problem recht schnell und einfach zu lösen?


Gruß
Dirk

hoika 26. Apr 2007 16:51

Re: IDs schnell abändern
 
Hallo,

was heisst denn "ändern" ?
+1, -10 ??

Ich würde sowas immer mindestens über ne prepared Query machen.
Da du ZEOS benutzt, istd ie praktischer schon prepared,
wenn du eine parametrisierte Query benutzt.

Delphi-Quellcode:
SQL.Clear;
SQL.Add('Update MyTable Where Id=:Id');
for i:= 1 to 10000 do
begin
  ParamByName('Id').AsInteger:= iBlaBla;
  ExecSQL;
end;
Falls der Update-Algorithmus einfach ist,
könnte man auch ne stored procedure benutzen.


Heiko

Udontknow 26. Apr 2007 16:59

Re: IDs schnell abändern
 
Mal eher etwas grundsätzliches: ID´s (Primärschlüssel) sollten nicht abgeändert werden, um Referenzen nicht zu zerstören. Ich habe bis jetzt nur einmal Primärschlüssel ändern müssen, das betraf die Zusammenführung/Replikation von Daten zweier Datenbanken. Dem Problem kann man aber auch entgegentreten, indem man unterschiedliche Schlüsselräume für die DBs nutzt...

Cu,
Udontknow

trashcandesign 26. Apr 2007 17:07

Re: IDs schnell abändern
 
@hoika

Schöner Ansatz, ändert an der Geschwindigkeit aber leider nichts.


@Udontknow

Es geht genau darum, dass ich Teildaten aus einer Datenbank in eine Andere schieben muss, aber eben in der Ziel-DB nicht allse löschen kann, sondern die 11000 Datensätze hinzufügen muss!

In beiden DBs gibt es ständig Daten, die hinzugefügt/gelöscht werden, also ist das mit den Adressräumen auch nicht so einfach.

Bei meinem Problem geht es um einen Ex- bzw. Import.

Udontknow 26. Apr 2007 17:10

Re: IDs schnell abändern
 
Wieso? Wie bestimmst du denn eine neue ID? Du solltest so etwas wie einen IDGenerator für die Inserts nutzen.

So hättest du ja nun auch das Problem, daß einmal importierte Daten einen neuen Schlüssel bekommen, und ein Update anstelle eines simplen Inserts unmöglich wird...

Cu,
Udontknow

Jelly 26. Apr 2007 17:11

Re: IDs schnell abändern
 
Wenn du sie von A nach B kopieren/importieren musst, warum denn vorher die ID ändern und dann erst in Tabelle B einfügen. Das kannst Du doch in einem Ruck machen.

hoika 26. Apr 2007 17:22

Re: IDs schnell abändern
 
Hallo,

das iId hatte ich ja gar nicht gesehen.

Update MyTable Set Id=Id+1000 (z.B.)

Da kann auch noch ein Where dahinter.

Das setzt die Id aller Werte um 1000 hoch.

Tip: Die 1000 kann man auch durch eine andere Zahl ersetzen ... ;)


Heiko

trashcandesign 27. Apr 2007 07:57

Re: IDs schnell abändern
 
Moin,

@hoika
DANKE! :hello:
Genau das hatte ich gesucht.
Hat zwar ne Weile gedauert, bis ich das kapiert hab, dachte du willst schon wieder, dass ich das in einer Schleife abarbeite, aber nun funzt es extrem schnell.

Wusste noch nicht, dass ich innerhalb eines SQL-Statements auch Berechnungen durchführen kann.
Ist das SQL-Standard, sodass das auch in Access, MSSQL, Oracle usw. funktioniert?


Und danke für den Tip, das hat mich dann gleich mal vor meiner nächsten Frage bewahrt :lol:

Sharky 27. Apr 2007 08:00

Re: IDs schnell abändern
 
Zitat:

Zitat von trashcandesign
... Ist das SQL-Standard, sodass das auch in Access, MSSQL, Oracle usw. funktioniert? ...

Hai,

das sollte mit jedem SQL-System funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:40 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