AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datenbank updaten

Ein Thema von Gambit · begonnen am 7. Apr 2005 · letzter Beitrag vom 7. Apr 2005
Antwort Antwort
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#1

Datenbank updaten

  Alt 7. Apr 2005, 13:37
Datenbank: MySQL • Version: 4 • Zugriff über: ZEOS
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
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

Re: Datenbank updaten

  Alt 7. Apr 2005, 14:52
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?)
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Datenbank updaten

  Alt 7. Apr 2005, 15:06
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
  Mit Zitat antworten Zitat
Gambit

Registriert seit: 28. Mai 2003
680 Beiträge
 
Delphi 7 Professional
 
#4

Re: Datenbank updaten

  Alt 7. Apr 2005, 15:19
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...
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:13 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