![]() |
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:
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.
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; 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 |
Re: Datenbank updaten
Du kannst es auch folgendermaßen machen:
Delphi-Quellcode:
Ist jetzt eine Frage der Datenmenge und Laufzeit.
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; Was machst du denn mit Datensätzen, die in deiner Temp-Tabelle gelöscht werden? (oder geht das nicht?) |
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
|
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 09:43 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