Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Relationale DB anlegen & mit Daten füllen, SQL Skript (https://www.delphipraxis.net/87912-relationale-db-anlegen-mit-daten-fuellen-sql-skript.html)

Salomon 7. Mär 2007 10:01

Datenbank: MS SQL Server Express • Zugriff über: ADO

Relationale DB anlegen & mit Daten füllen, SQL Skript
 
Hi,
ich habe per Skript zwei Tabellen erstellt. Diese sind miteinander verknüpft. Nun möchte ich mit dem SQl Skript gleich nach dem Anlegen der Tabellen einige Daten in die DB mittels Insert Befehls aufnehmen.


SQL-Code:
CREATE TABLE "TB_Teams"
(
  "TeamID"      INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
  "Name"        VARCHAR(50),
  "Leader"      VARCHAR(50),
  "Description" VARCHAR(50),
);


CREATE TABLE "TB_Users"
(
  "UserID"      INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
  "LoginName"   VARCHAR(50),
  "FirstName"   VARCHAR(50),
  "LastName"    VARCHAR(50),
  "Phone"       VARCHAR(50),
  "EMail"       VARCHAR(50),
  "Password"    VARCHAR(50),
  "FK_TeamID"   INT,
  FOREIGN KEY(FK_TeamID)   REFERENCES TB_Teams(TeamID),
);
Die User befinden sich in einem Team, daher ist die Tabelle mit der Team Tabelle vernüpft. Sind die Datensätze automatisch verknüpft wenn ich als "FK_TeamID" die TeamID des jeweiligen Teams mitgebe?

Das erste Team -> Team1 bekommt durch das autoincrement automatisch die TeamID1.

Befindet sich der folgende User dann im Team 1 wenn ich ihn wie folgt anlege. Das ganze ist ehr eine Verständisfrage...

SQL-Code:
INSERT INTO TB_User("LoginName", "FirstName", "LastName",  .... "FK_TeamID")
  VALUES ('LoginName','Max', 'Mustermann' ... '1');
MfG
Marcus

mkinzler 7. Mär 2007 10:07

Re: Relationale DB anlegen & mit Daten füllen, SQL Skrip
 
Was meinst du mit automatisch? Die Verknüpfung ist ja nur logisch durch den wert des FKs. Das FOREIGN KEY im CREATE-Statement weißt den Server ja nur an, zu überprüfen, ob der wert in der anderen Tabelle überhaupt existiert.

Salomon 7. Mär 2007 10:14

Re: Relationale DB anlegen & mit Daten füllen, SQL Skrip
 
Das heißt also wenn das FK_TeamID Feld der User Tabelle und das TeamID Feld der Teams Tabelle den selben Wert haben sind die Datensätze miteinander verknüpft?

mkinzler 7. Mär 2007 10:39

Re: Relationale DB anlegen & mit Daten füllen, SQL Skrip
 
Ja, das ist das Prinzip von relationalen Datenbanken.

Salomon 7. Mär 2007 10:48

Re: Relationale DB anlegen & mit Daten füllen, SQL Skrip
 
Wußte ich doch das ich das soweit verstanden habe ;)

Im Programm werde ich dann mit DBLookup Komponenten arbeiten, um z.B. bei einem User anzuzeigen in welchem Team er ist? Das Anzeigen der Team ID macht ja nicht so viel Sinn...

mkinzler 7. Mär 2007 10:59

Re: Relationale DB anlegen & mit Daten füllen, SQL Skrip
 
Du kannst ja in der Abfrage den Namen des Teams hinzujoinen.

Salomon 7. Mär 2007 11:16

Re: Relationale DB anlegen & mit Daten füllen, SQL Skrip
 
Du meinst sowas wie:

SQL-Code:
SELECT TB_Users.FirstName, TB_Users.LastName, TB_Teams.Name
FROM TB_Users, TB_Teams
WHERE TB_Users.FK_TeamID = TB_Teams.TeamID
?

Mit dem Code in einer ADOQuery Komponente sollten man meine ich einen User mit dem Team zu dem er gehört anzeigen können...

NormanNG 7. Mär 2007 11:31

Re: Relationale DB anlegen & mit Daten füllen, SQL Skrip
 
Hi,

SQL-Code:
INSERT INTO TB_User("LoginName", "FirstName", "LastName",  .... "FK_TeamID")
  VALUES ('LoginName','Max', 'Mustermann' ... '1');
Mal abgesehen davon, das die TeamID eigendlich ein Integer ist und das Insert nur durch "Server-Magic" (autom. Konvertierung) funktioniert:

Auf die "1" als ID für das erste eingefügte Team kann man sich nur verlassen, wenn die Tabelle gerade angelegt wurde. Wurden bereits andere Team-Datensätze eingefügt und dann wieder gelöscht, wird - auch bei leerer Tabelle - das nächste eingefügte Team *nicht* die ID=1 bekommen!

SQL-Code:
INSERT INTO TB_User("LoginName", "FirstName", "LastName",  .... "FK_TeamID")
  SELECT 'LoginName', 'Max', 'Mustermann' ... , t.TeamID
  FROM TB_Teams t where Name = 'XYZ'
...liefert für das Team XYZ immer die richtige TeamID.

Dabei sollte natürlich TB_Teams.Name eindeutig sein (evtl. mit unique key).


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