Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi automatisch ein Primärschlüsselfeld erzeugen? (https://www.delphipraxis.net/48442-automatisch-ein-primaerschluesselfeld-erzeugen.html)

smart 25. Jun 2005 12:25

Datenbank: ABS • Version: 488 • Zugriff über: Datascore

automatisch ein Primärschlüsselfeld erzeugen?
 
Wie kann man beim Erstellen einer Tabelle erreichen, das automatisch ein Feld als Primärschlüsselfeld erzeugt wird.

Hansa 25. Jun 2005 12:27

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Wozu soll denn das gut sein ? :shock: Ich würde mich jedenfalls herzlichst bedanken, wenn die DB mir einfach so Felder anlegt. :mrgreen:

smart 25. Jun 2005 12:34

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Zitat:

Zitat von Hansa
Wozu soll denn das gut sein ? :shock: Ich würde mich jedenfalls herzlichst bedanken, wenn die DB mir einfach so Felder anlegt. :mrgreen:

Ich habe ein Datenbankprogramm geschrieben. Die Anwenderin (meine Freundin) vergisst immer ein Primärschlüsselfeld anzulegen, welches aber zu einem späteren Zeitpunkt benötigt wird. Daher kam ich auf die Idee es automatisch an zu legen.

Chris1986 25. Jun 2005 12:42

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Hi smart,
warum erstellt deine Freundin denn immer neue Tables? Ober vergisst sie den Schlüssel beim einfügen eines Datensatzes? Dafür gibts ja dann die Funktion Auto-Increment.

Gruß
Christian

smart 25. Jun 2005 12:51

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Zitat:

Zitat von Chris1986
Hi smart,
warum erstellt deine Freundin denn immer neue Tables? Ober vergisst sie den Schlüssel beim einfügen eines Datensatzes? Dafür gibts ja dann die Funktion Auto-Increment.

Gruß
Christian

Ist es denn möglich mit dem vom Auto-Increment erzeugten Datensatz, Felder aus 2 Tabellen zu verlinken?

Gruß
Heike.

Hansa 25. Jun 2005 12:59

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Was Du jetzt meinst, das ist ein zusammengesetzter Schlüssel. Der setzt sich aber normalerweise aus zwei unabhängigen Primary Keys der beiden Tabellen zusammen usw. usf. Oder ist das Thema nur : "Frauen und Technik" :mrgreen:

smart 25. Jun 2005 13:08

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Zitat:

Zitat von Hansa
Was Du jetzt meinst, das ist ein zusammengesetzter Schlüssel. Der setzt sich aber normalerweise aus zwei unabhängigen Primary Keys der beiden Tabellen zusammen usw. usf. Oder ist das Thema nur : "Frauen und Technik" :mrgreen:

Ja, genau. So weit mir bekannt ist, müssen die Primary Keys bei der Erstellung der Tabelle erstellt werden. Meine Frage ging jetzt dahin, ob man die Primary Keys auch automatisch erstellen lassen kann?

Hansa 25. Jun 2005 13:24

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Da kommen wir der Sache schon näher. Es geht also doch um die Werte ? Die sollte man ja auch nicht vom User eingeben lassen. Das Ganze hängt jetzt aber gewaltig von der DB ab. Bei Paradox ist das Autoincrement und ich verwende Trigger (IB/FB). Deine exotischen Sachen kenne ich jetzt allerdings nicht und muß passen.

ltiefland 25. Jun 2005 13:32

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Zitat:

Zitat von smart
Zitat:

Zitat von Chris1986
Hi smart,
warum erstellt deine Freundin denn immer neue Tables? Ober vergisst sie den Schlüssel beim einfügen eines Datensatzes? Dafür gibts ja dann die Funktion Auto-Increment.

Gruß
Christian

Ist es denn möglich mit dem vom Auto-Increment erzeugten Datensatz, Felder aus 2 Tabellen zu verlinken?

Gruß
Heike.

Hallo Heike,

ja das ist möglich. Du mußt dann natürlich ein entsprechendes Feld in den abhängigen Tabllen haben. Felder können auch naträglich noch als PRIMARY KEY definiert werden. Wichtig ist nur, daß die Werte in dieser Spalte auch eindeutig sind. Daher ist AUTO INCREMENT für solche Felder immer die beste Wahl, wenn der Primärschlüssel "künstlich" sein soll, wie z. B. in einer User-Tabelle. Wenn Du ein Beispiel benötigst, so sage es mir einfach und ich stelle Dir hier etwas zur Verfügung.

smart 25. Jun 2005 15:25

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Ich habe schon alles mögliche programmiert, aber mit so einer dummen Datenbankprogrammierung tue ich mich sehr schwer
Zitat:

Zitat von ltiefland
Hallo Heike,
Felder können auch naträglich noch als PRIMARY KEY definiert werden. Wichtig ist nur, daß die Werte in dieser Spalte auch eindeutig sind.

Ja, aber wie?

Zitat:

Zitat von ltiefland
Daher ist AUTO INCREMENT für solche Felder immer die beste Wahl, wenn der Primärschlüssel "künstlich" sein soll, wie z. B. in einer User-Tabelle. Wenn Du ein Beispiel benötigst, so sage es mir einfach und ich stelle Dir hier etwas zur Verfügung.

Eigentlich möchte ich nur 2 Tabellen verlinken. Dummerweise habe die keine Primary Keys. In den Tabellen sind aber schon ca. 400 Einträge.

ltiefland 25. Jun 2005 15:36

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Zitat:

Zitat von smart
Ich habe schon alles mögliche programmiert, aber mit so einer dummen Datenbankprogrammierung tue ich mich sehr schwer
Zitat:

Zitat von ltiefland
Hallo Heike,
Felder können auch naträglich noch als PRIMARY KEY definiert werden. Wichtig ist nur, daß die Werte in dieser Spalte auch eindeutig sind.

Ja, aber wie?

Beispiel:

ALTER TABLE test_table PRIMARY KEY(id);

Zitat:

Zitat von smart
Zitat:

Zitat von ltiefland
Daher ist AUTO INCREMENT für solche Felder immer die beste Wahl, wenn der Primärschlüssel "künstlich" sein soll, wie z. B. in einer User-Tabelle. Wenn Du ein Beispiel benötigst, so sage es mir einfach und ich stelle Dir hier etwas zur Verfügung.

Eigentlich möchte ich nur 2 Tabellen verlinken. Dummerweise habe die keine Primary Keys. In den Tabellen sind aber schon ca. 400 Einträge.

Das ist dann blöd, weil die Werte eventuell nicht eindeutig sind. Da müßtest Du dann einen sogenannten "Reload" durchführen. Also: Datenbankinhalt sichern (als SQL-Datei), Inhalt der Tabellen löschen, Primary Key anlegen und Daten neu einspielen. Vorher mußt Du aber im SQL-Dump die Werte für den Schlüssel eindeutig machen. Die Werte in der zweiten Tabelle müssen dann natürlich auch angepaßt werden, amit da nichts ins Datennirwana zeigt.

smart 25. Jun 2005 15:43

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Vielen Dank Lars, für Deine umassende Antwort!

Noch eine dummer Frage, wie legt man einen
Zitat:

Zitat von ltiefland
wenn der Primärschlüssel "künstlich" sein soll, wie z. B. in einer User-Tabelle.

an?

Heike.

Sharky 25. Jun 2005 16:44

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Hai Heike,

ersteinmal zum Verständniss:

Ein Primaky Key ist ersteinmal "nur" ein Feld innerhalb einer Tabelle welches einen einmaligen Wert besitzt. Wie dieser erzeugt wird ist ersteinmal egal. Du kannst eine GUID verwenden oder irgendetwas von dem Du sicherstellst das es einmalig ist in der Tabelle. Vorzugsweise verwendet man dafür natürlich ein AutoInc-Feld.

Es muss auch kein Index auf diesem Feld liegen. mySQL z.B. verlangt das auf dem AutoInc-Feld einer Tabelle (es darf nur eines geben) immer ein Index gelegt wird. ABS-Database ist das völlig egal.

Wenn Du nun eine ABS-Tabelle hast in der schon Daten vorhanden sind solltest Du einfach ein ID-Feld (Typ AutoInc) hinzufügen können. Dieses wird dann automatisch gefüllt (in deinem Beispiel 1 bis 400).

Wenn Du zwei Tabellen verknüpfen möchtest muss immer nur die Master Tabelle einen PK haben. Die Detail-Tabelle braucht nur ein Feld zur Verknüpfung mit dem PK aus der Mastertabelle (FOREIGN Key).

smart 25. Jun 2005 18:13

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Zitat:

Zitat von Sharky
Hai Heike,

ersteinmal zum Verständniss:

Ein Primaky Key ist ersteinmal "nur" ein Feld innerhalb einer Tabelle welches einen einmaligen Wert besitzt. Wie dieser erzeugt wird ist ersteinmal egal. Du kannst eine GUID verwenden oder irgendetwas von dem Du sicherstellst das es einmalig ist in der Tabelle. Vorzugsweise verwendet man dafür natürlich ein AutoInc-Feld.

Es muss auch kein Index auf diesem Feld liegen. mySQL z.B. verlangt das auf dem AutoInc-Feld einer Tabelle (es darf nur eines geben) immer ein Index gelegt wird. ABS-Database ist das völlig egal.

Wenn Du nun eine ABS-Tabelle hast in der schon Daten vorhanden sind solltest Du einfach ein ID-Feld (Typ AutoInc) hinzufügen können. Dieses wird dann automatisch gefüllt (in deinem Beispiel 1 bis 400).

Wenn Du zwei Tabellen verknüpfen möchtest muss immer nur die Master Tabelle einen PK haben. Die Detail-Tabelle braucht nur ein Feld zur Verknüpfung mit dem PK aus der Mastertabelle (FOREIGN Key).

Hallo Stephan!

Ich glaube, jetzt habe ich es geschnallt. Ich könnte dann die erstellten ID-Feld (Typ AutoInc) miteinander verknüpfen, oder? Jetzt sag bitte nicht 'Falsch'.

Heike.

Sharky 25. Jun 2005 18:25

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Zitat:

Zitat von smart
... Ich glaube, jetzt habe ich es geschnallt. Ich könnte dann die erstellten ID-Feld (Typ AutoInc) miteinander verknüpfen, oder? Jetzt sag bitte nicht 'Falsch' ....

Hai Heike,

ich sage nicht "Falsch" wenn Du es richtig meinst ;-)
"Verknüpft" werden nicht die AutoInc-Felder sondern nur eines.

Code:
Tabelle : anreden
---------------------------
anrede_ID : AutoInc    <- Das ist ein PK in dieser Tabelle
anrede_text : String(20)


Tabelle : namen
---------------------------
namen_id    : AutoInc     <- PK für diese Tabelle. Ist aber für diesen Fall nicht notwendig
fk_anrede_id : INTEGER <- In diesem Feld wird der PK aus der Tabelle anreden gespeichert
vorname     : String(50)
....
Wenn Du jetzt einen neuen Eintrag in der Tabelle namen machst wird in dem Feld "fk_anrede_id" (vom Typ Integer weil der PK auch in Integerfeld ist) der AutoInc-Wert aus der Tabelle anreden eingetragen.

Das ganze kann dann so aussehen:
Code:
Tabelle : anreden
---------------------------
anrede_id     anrede_text
---------------------------
1              Herr
2              Frau
3              Fisch
---------------------------

Tabelle : namen
---------------------------------------
namen_id      fk_anrede_id   vorname
---------------------------------------
1              2               Heike
2              1               Stephan
3              2               Sharkyline
4              3               Sharky
---------------------------------------
Ich hoffe jetzt ist es klarer?

smart 25. Jun 2005 18:29

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Ich hatte früher mal etwas mit Clipper Programmiert, dass war so eine Art DBase. Wenn man da zwei Felder aus zwei Tabellen verlinken wollte, musst man immer das entsprechende Feld ‚indizieren’ und dann konnte man die ‚indizierten’ Felder verknüpfen.

Heike.

smart 25. Jun 2005 18:36

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Zitat:

Zitat von Sharky
ich sage nicht "Falsch" wenn Du es richtig meinst ;-)
"Verknüpft" werden nicht die AutoInc-Felder sondern nur eines.

Waaas...., so einfach ist das. Tut mir leid, dass ich so dumm gefragt habe. Ich hatte zuvor immer in die falsche Richtung gedacht.
Zunächst vielen Dank für die sehr gute Antwort.

Heike.

Sharky 25. Jun 2005 18:47

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Zitat:

Zitat von smart
... Zunächst vielen Dank für die sehr gute Antwort...

Immer wieder gerne ;-)

Kleiner Nachtrag (bevor Du fragen solltest).
Um das eintragen des PKs im Feld fk_anrede_id musst Du dich natürlich selber kümmern. Das kann Dir keine Datenbank abnehmen.

Zum Thema Indexe: Es ist natürlich immer sinnvoll auf den PK einen Index zu legen.
Bei "richtigen" DBMS würde man auch noch auf das Feld fk_anrede_id einen FOREIGN KEY setzen.
Je nach einstellung in der DB kann man so z.B. verhindern das ein Datensatz aus der Tabelle andrede gelöscht wird wenn es in der Tabelle namen noch abhängige Datensätze gibt.

smart 25. Jun 2005 18:59

Re: automatisch ein Primärschlüsselfeld erzeugen?
 
Zitat:

Zitat von Sharky
Kleiner Nachtrag (bevor Du fragen solltest).
Um das eintragen des PKs im Feld fk_anrede_id musst Du dich natürlich selber kümmern. Das kann Dir keine Datenbank abnehmen.

Ist klar, woher soll die Datenbank das auch wissen.

Zitat:

Zitat von Sharky
Zum Thema Indexe: Es ist natürlich immer sinnvoll auf den PK einen Index zu legen.
Bei "richtigen" DBMS würde man auch noch auf das Feld fk_anrede_id einen FOREIGN KEY setzen.
Je nach einstellung in der DB kann man so z.B. verhindern das ein Datensatz aus der Tabelle andrede gelöscht wird wenn es in der Tabelle namen noch abhängige Datensätze gibt.

Also ist es ratsam dies gleich immer bei der Erstellung der/die Tabelle/n zumachen.

Uff..., dass war jetzt aber eine schwere Geburt!

Nochmal, herzlichen Dank für Deine nette Hilfe.

Heike.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:15 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