Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbank updaten (https://www.delphipraxis.net/43701-datenbank-updaten.html)

Gambit 7. Apr 2005 12:37

Datenbank: MySQL • Version: 4 • Zugriff über: ZEOS

Datenbank updaten
 
Hallo,

ich habe zwei Datenbanken, nenen wir sie mal DBMain und DBTmp.

DBMain wird mit Hilfe von DBTmp erstellt. Beide haben einen Integer als Primärschlüssel.

Beim ersten Erstellen von DBMain werden Daten inclusive Primärschlüssel aus DBTmp ausgelesen und mittells SQL-Insert in DBMain eingefügt.

In regelmäßigen Abständen wird DBTmp aktualisiert, dabei werden sowohl bestehende Datensätze geändert und es kommen auch neue Datensätze dazu.
Nun möchte ich nach einer Aktualisierung von DBTmp natürlich auch DBMain aktualisieren. Ich könnte dazu natürlich DBMain komplett droppen und aus DBTmp neu aufbauen. Das will ich aber nicht sondern ich möchte die Datensätze die in DBTmp geändert wurden auch in DBMain ändern und neue Datensätze aus DBTmp ebenfalls zu DBMain hinzufügen.

Dazu habe ich mir folgendes überlegt:

Delphi-Quellcode:
begin
  ZQueryTmp.SQL.Clear;
  ZQueryTmp.SQL.Add('select * from Tbl_Tmp order by ID asc');
  ZQueryTmp.Open;

  ZQueryMain.SQL.Clear;
  ZQueryMain.SQL.Add('select * from tbl_Main order by No asc');
  ZQueryMain.Open;


  ZQueryTmp.First;

  for i:= 1 to ZQueryMain.RecordCount do
  begin
    ZQueryMain.SQL.Clear;
    ZQueryMain.SQL.Add('Update tbl_DBMain set No = '+ZQueryTmp.fieldByName('ID').AsString)+','+
                       ...+
                      ' where No = '+ ZQueryTmp.fieldByName('ID').AsString);
    ZQueryMain.ExecSQL;

    ZQueryTmp.Next;
  end;


  while not ZQueryTmp.Eof do
  begin
    ZQueryMain.SQL.Clear;
    ZQueryMain.SQL.Add('Insert into tbl_DBMain Values('+ ZQueryTmp.fieldByName('ID').AsString+','+
                        ...+')');
    ZQueryMain.ExecSQL;
    ZQueryTmp.Next;
  end;
end;
Die erste Schleife läuft (Anzahl Datensätze DBMain)-mal durch und aktualisiert alle Datensätze mit Hilfe von DBTmp und die zweite Schleife macht praktisch dort weiter, wo es in DBTmp neue Datensätze gibt und fügt sie DBMain hinzu.

Meine Frage: Da ja die Datensätze aufsteigend nach Primärschlüssel sortiert vorliegen, könnte man das so machen? Oder habe ich was wichtiges vergessen?

Gruß

Gambit

Stevie 7. Apr 2005 13:52

Re: Datenbank updaten
 
Du kannst es auch folgendermaßen machen:
Delphi-Quellcode:
begin
  ZReadOnlyQuery.Open; {Temp-Tabelle}
  ZQuery.Open;        {Main-Tabelle}
  while not ZReadOnlyQuery.Eof do
  begin
    if ZQuery.Locate('ID', ZReadOnlyQuery.FieldValues['ID'] , []) then
      ZQuery.Edit
    else
    begin
      ZQuery.Append;
      ZQuery.FieldValues['ID'] := ZReadOnlyQuery.FieldValues['ID'];
    end;
    { andere Felder kopieren }
    ZQuery.Post;
    ZReadOnlyQuery.Next;
  end;
  ZReadOnlyQuery.Close;
  ZQuery.Close;
end;
Ist jetzt eine Frage der Datenmenge und Laufzeit.
Was machst du denn mit Datensätzen, die in deiner Temp-Tabelle gelöscht werden? (oder geht das nicht?)

Jelly 7. Apr 2005 14:06

Re: Datenbank updaten
 
Hmm... du bearbeitest also nur Daten aus der tmp Datenbank, und NIE aus der Main, oder. Dann könntest du auch ein Dump erstellen, und die Main Datenbank komplett neu erstellen lassen, also mit Droptable, create Table und allen Inserts... Wenn der Datenumfang es erlaubt, versteht sich

Gambit 7. Apr 2005 14:19

Re: Datenbank updaten
 
Klar könnte ich ein Dump erstellen, das will ich aber gerade nicht. Wenn ich die DBMain nicht komplett neu erstelle sondern mit oben beschriebenem Code update, kann ich doch gleichzeitig auch noch drauf zugreifen, oder?


//Edit: Der Code von Stevie ist auch nicht schlecht, bewirkt er letztendlich aber auch nichts anderes als meiner, könnte aber unter Umständen langsamer sein? Und die nächste Antwort, nein, Datensätze werden aus TMP nicht gelöscht, sonst würde es so auch nicht gehen. Dann müsste ich zuerst den Maximalwert von No ermitteln und damit in der zweiten Schleife in Tmp reingehen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz