Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Foreign Key Problem (https://www.delphipraxis.net/96956-foreign-key-problem.html)

bl3nder 2. Aug 2007 08:48

Datenbank: mysql • Version: 5.0.11 • Zugriff über: Query

Foreign Key Problem
 
Hi , Ich steh voll auf der Leitung grad...

Ich will zwei Tables erstellen, die durch einen Foreign Key miteinander verknuepft sind...

Ein Table Person, in der alle Personen gespeichert werden
Ein Table Customer, die Personen enthaelt, die etwas gekauft haben.

Nun hab ich folgende zwei Tables mit mysql erstellt :

SQL-Code:
CREATE TABLE `x`.`Customer` (
  `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `TotalPrice` DOUBLE NOT NULL DEFAULT 0,
  PRIMARY KEY(`ID`)
)
ENGINE = InnoDB;


CREATE TABLE `x`.`Person` (
  `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `CustomerID` INTEGER UNSIGNED NOT NULL DEFAULT 0,
  `ADName` VARCHAR(45) NOT NULL DEFAULT '',
  PRIMARY KEY(`ID`),
  CONSTRAINT `CustomerID` FOREIGN KEY `CustomerID` (`ID`)
    REFERENCES `customer` (`ID`)
    ON DELETE CASCADE
    ON UPDATE CASCADE
)
ENGINE = InnoDB;
Wenn ich nun
SQL-Code:
insert into x.person (ADName) VALUES ('Name1')
eingebe, erhalte ich folgende Meldung:

Zitat:

Cannot add or update a child row: a foreign key constraint fails
Liegt es daran, dass ich noch keine Customer erstellt habe ? Ich will allerdings zunaechst alle Personen in die Datenbank schreiben, bevor Kunden hinzugefuegt werden koennen...

DeddyH 2. Aug 2007 08:51

Re: Foreign Key Problem
 
Zitat:

Zitat von bl3nder
Liegt es daran, dass ich noch keine Customer erstellt habe ?

Genau. Der Sinn eines Foreign Key ist ja der, sicherzustellen, dass im Bezug nehmenden Feld der Detailtabelle nur Werte stehen dürfen, die in der Mastertabelle auch vorhanden sind. Du wirst also zunächst die Kunden erfassen müssen.

bl3nder 2. Aug 2007 09:02

Re: Foreign Key Problem
 
Da es aber immer mehr Personen als Kunden gibt, hat das keinen Sinn...
Muss ich vieleicht den FK im Table Customer unterbringen ?

DeddyH 2. Aug 2007 09:09

Re: Foreign Key Problem
 
Wieso hat das keinen Sinn? Falls ich das richtig sehe, handelt es sich um eine 1:n-Beziehung, d.h. ein Kunde kann mehrere Personen haben, eine Person ist aber genau einem Kunden zugeordnet. Von daher ist das Datenmodell völlig in Ordnung. Was spricht denn dagegen, erst die Kunden zu erfassen?

hoika 2. Aug 2007 09:12

Re: Foreign Key Problem
 
Hallo,

erzeuge einen Kunden mit Kunden-Id=0,
lasse den Record sonst komplett leer.

Trage bei neuen Personen, wo du den Kunden noch nicht kennst,
die KundenId 0 ein.

Das hat zusätzlich noch den Vorteil,
dass die einen inner join statt einem left join benutzren kannst,
wenn du die Daten der Person incl. des Kunden brauchst.


Heiko

bl3nder 2. Aug 2007 09:42

Re: Foreign Key Problem
 
Hi,

Meine Personentabelle listet alle Personen auf, die ggf. Kunden werden koennen .
D.h. Zu jedem Kunden gibt es genau eine Person und zu jeder Person gibt es genau einen Kunden.
Die Kundentabelle ist quasi nur eine vererbte Klasse, in der sich noch weitere Details befinden, die sich auf irgendwelche Geschaefte beziehen. Wird nun eine Person geloescht, so auch der Kundendatensatz, da diese Person nicht mehr existiert.

Ich hab also jetz folgendes gemacht:
SQL-Code:
CREATE TABLE `x`.`Person` (
  `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  ADName Varchar....
   ....,

  PRIMARY KEY(`ID`)
)
ENGINE = InnoDB;


CREATE TABLE `x`.`Customer` (
  `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `PersonID` INTEGER UNSIGNED NOT NULL DEFAULT 0,
  `TotalPrice` DOUBLE NOT NULL DEFAULT 0,
  FOREIGN KEY (`PersonID`) REFERENCES `Person`(`ID`) ON DELETE CASCADE,
  PRIMARY KEY(`ID`)
)
ENGINE = InnoDB;
Somit werden Kunden geloescht, wenn die jeweilige Person geloescht wird.
Hoffe das funzt jetzt so.
Danke fuer die Antworten


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 Uhr.

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