Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Update einer Datenbanktabelle (https://www.delphipraxis.net/80330-update-einer-datenbanktabelle.html)

Tommahawk 7. Nov 2006 13:19

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:
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
So weit, so gut. Wie man sieht entspricht der Inhalt des Feldes NR der Datenbanktabelle1 dem Inhalt des Feldes NR1 der Datenbanktabelle2.

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

oki 7. Nov 2006 13:28

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]

DGL-luke 7. Nov 2006 13:31

Re: Update einer Datenbanktabelle
 
SQL-Code:
UPDATE table1 as tbl1, table2 as tbl2 SET tbl1.NR = tbl2.NR2 WHERE tbl1.NR = tbl2.NR1
So in etwa? Aber bitte erst testen ;)

Tommahawk 7. Nov 2006 13:43

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

oki 7. Nov 2006 13:45

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!

DGL-luke 7. Nov 2006 14:11

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:

Tommahawk 7. Nov 2006 14:14

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

oki 7. Nov 2006 14:29

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

NormanNG 7. Nov 2006 14:41

Re: Update einer Datenbanktabelle
 
Hi,

so wie das oben beschrieben ist, einfach Datenbanktabelle1 löschen und dann neu füllen:
SQL-Code:
select Nr2 from Datenbanktabelle2
Aber in Datenbanktabelle1 ist sicher noch mehr drin... :wink:

Dann würde ich Datenbanktabelle1 in eine temporäre Tabelle kopieren, Datenbanktabelle1 dann leeren und neu füllen:
SQL-Code:
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
ist zwar nicht schön, aber das Datenbankdesign auch nicht wirklich... :-D

getippt - nicht getestet

[edit] kein roter kasten?[/edit]

hoika 7. Nov 2006 16:23

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 22:20 Uhr.
Seite 1 von 2  1 2      

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