![]() |
Datenbank: Interbase • Version: 6.0 • Zugriff über: TIBSQL
Update einer Datenbanktabelle
Hallo liebe Freunde!
Seit langer Abstinenz melde ich mich nun wieder zurück ... mit einem neuen Problem. :roteyes: 1. Beschreibung: Ich habe zwei Datenbanktabellen. Datenbanktabelle1 hat ein Feld NR, das der Primärschlüssel ist. Datenbanktabelle2 hat zwei Felder, NR1 und NR2, beide vom Typ INTEGER. Das Feld NR1 ist der Primärschlüssel. Das Feld NR2 ist eindeutig. Die Datenbanktabellen sind mit folgenden Daten gefüllt.
Code:
So weit, so gut. Wie man sieht entspricht der Inhalt des Feldes NR der Datenbanktabelle1 dem Inhalt des Feldes NR1 der Datenbanktabelle2.
Datenbanktabelle1 Datenbanktabelle2
NR NR1 NR2 1 1 10 7 7 4 8 8 2 9 9 7 2 2 1 10 10 5 4 4 8 2. Aufgabe :wall:: Nun soll jeweils der Wert des Feldes NR2 der Datenbanktabelle2 in das Feld NR der Datenbanktabelle1 übertragen werden. Verknüpft werden die beiden Datenbanktabellen über die Felder Datenbanktabelle1.NR und Datenbanktabelle2.NR1. Erwähnenswert ist vielleicht noch, dass die Datenbanktabellen statt der sieben genauso gut 1000000 Datensätze enthalten können. 3. Lösung: :coder2: :freak: Ich hab keine Ahnung! Eine sinnvolle Lösung habe ich noch nicht gefunden. Wünschenswert wäre eine SQL-Anweisung. :duck: Okay, wenn man die Aufgabe mit zwei SQL-Anweisungen lösen kann (SELECT und UPDATE), dann bin ich auch noch zufrieden. Jetzt seid Ihr gefragt. 4. Problem: Als Schwierigkeit hat sich die Reihenfolge herausgestellt, in der die Datensätze der Datenbanktabelle1 aktualisiert werden. Und nun macht mir ein paar Vorschläge! Helft mir! Vorab schon einmal vielen Dank. Thomas a.k.a. Tommahawk |
Re: Update einer Datenbanktabelle
Hi,
ich konnte deinem Post bisher keine konkrete Frage entnehmen. Kannst Du die mal kurz formulieren. Was du hast, konnte man sehen. Gruß oki [edit="oki"] Tschuldige, hab erst nach DGL-luke's Post die Frage geschnallt [/edit] |
Re: Update einer Datenbanktabelle
SQL-Code:
So in etwa? Aber bitte erst testen ;)
UPDATE table1 as tbl1, table2 as tbl2 SET tbl1.NR = tbl2.NR2 WHERE tbl1.NR = tbl2.NR1
|
Re: Update einer Datenbanktabelle
Hallo oki,
Du hast ja Recht. Ich hab keine spezielle Frage gestellt. Mich interessiert ganz einfach, wie andere diese Aufgabe lösen würden. Aber wenn Du eine spezielle Frage möchtest, dann sollst Du sie auch bekommen. Wie aktualisiere ich die Werte des Feldes NR der Datenbanktabelle1 mit den Werten des Feldes NR2 der Datenbanktabelle2, ohne eine Fehlermeldung aufgrund doppelter Werte im Primärschlüssel der Datenbanktabelle1 zu erhalten? Viele Grüße, Thomas |
Re: Update einer Datenbanktabelle
Hi,
geht das wirklich so? Die beiden Tabellen werden doch über NR und NR1 referenziert. Wenn ich jetzt wie im Bsp. das Feld NR aus Tabelle 1 auf einen neuen Wert setze, dann önnen diese doch zweimal vorkommen und in der nächsten Anweisug für diesen Wert das zweite mal verändert werden. Bsp.: erstes Feld alt 1 --------- 1. Feld neu 10 ... sechstes Feld alt 10 gesucht ---------- Feld 1 und 6 gefunden und auf 5 geändert. :roteyes: oder wie jetzt? Gruß oki edit: jupp, und doppelte Werte bei schlüssel dann auch noch! |
Re: Update einer Datenbanktabelle
Ok, das stimmt... ich hätte gedacht, die Datenbank marschiert einmal komplett durch und prüft.
Ansosnten sage ich mal: Schlechtes Design :mrgreen: |
Re: Update einer Datenbanktabelle
Hallo oki,
aber wenn ich den ersten Wert des Feldes NR der Datenbanktabelle1 von 1 auf 10 ändere, dann erhalte ich doch eine Exception, weil doppelte Werte im Primärschlüssel nicht erlaubt sind. Hab ich das richtig verstanden, dass ich dann erst den alten Wert 10 in der Datenbanktabelle1 aktualisieren soll? Das geht in diesem Fall gut. Es könnte aber theoretisch sein, dass auch der neue Wert 5 bereits in der Datenbanktabelle1 existiert. Dann stehe ich wieder vor dem gleichen Problem und habe zu diesem Zeitpunkt noch keinen einzigen Wert aktualisiert. Viele Grüße, Thomas |
Re: Update einer Datenbanktabelle
Eben,
einen Primärschlüssel zu ändern birgt immer die Gefahr die Eindeutigkeit zu verlieren und damit Dateninkonsistenz zu erzeugen. Leider bin ich nicht der fitteste in SQL, aber ich würde es anders machen. 1. Du behältst die Indizes und verschiebst die restlichen Feldwerte zum neuen Datensatz (alle anderen Feldwerte aus altem Record in neuen Record). Dabei mußt du aber schauen, dass dur dir nicht Werte überschreibst, die noch brauchst. Somit müßtest du absteigend nach Nr2 sortieren und dann die werte aus Datensatz Tabelle 1 mit Nr aus NR1 in Datensatz Tabelle 1 mit Nr aus NR2 Tabelle 2 schreiben. Jo man, ich seh kaum noch durch. 2. Du schreibst eine temp. Tabelle und machst die wenn durch zur Tabelle 1. Da müßte glaub ich was mit eingebettetem select möglich sein!!! Primärschlüssel überschreiben würd ich aber lassen. Gruß oki |
Re: Update einer Datenbanktabelle
Hi,
so wie das oben beschrieben ist, einfach Datenbanktabelle1 löschen und dann neu füllen:
SQL-Code:
Aber in Datenbanktabelle1 ist sicher noch mehr drin... :wink:
select Nr2 from Datenbanktabelle2
Dann würde ich Datenbanktabelle1 in eine temporäre Tabelle kopieren, Datenbanktabelle1 dann leeren und neu füllen:
SQL-Code:
ist zwar nicht schön, aber das Datenbankdesign auch nicht wirklich... :-D
insert into temp select * from Datenbanktabelle1
delete from Datenbanktabelle1 insert into Datenbanktabelle1 (Nr,...) select Datenbanktabelle2.Nr2, Temp... from Datenbanktabelle2 join Temp on Temp.Nr=Datenbanktabelle2.Nr1 getippt - nicht getestet [edit] kein roter kasten?[/edit] |
Re: Update einer Datenbanktabelle
Hallo,
die Frage ist, soll das im laufenden Betrieb passieren ? Das wäre eh nicht gut (siehe Primärschlüssel ändern). Wenn nicht, schmeiss den Primärschlüssel kurz weg (alter table drop constraint) mache das Update wie oben gezeigt und füge den Primärschlüssel wieder dazu. (alter table add constraint) Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 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