AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Foreign Key Problem

Ein Thema von bl3nder · begonnen am 2. Aug 2007 · letzter Beitrag vom 2. Aug 2007
Antwort Antwort
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#1

Foreign Key Problem

  Alt 2. Aug 2007, 09:48
Datenbank: mysql • Version: 5.0.11 • Zugriff über: Query
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
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...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

Re: Foreign Key Problem

  Alt 2. Aug 2007, 09:51
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#3

Re: Foreign Key Problem

  Alt 2. Aug 2007, 10:02
Da es aber immer mehr Personen als Kunden gibt, hat das keinen Sinn...
Muss ich vieleicht den FK im Table Customer unterbringen ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

Re: Foreign Key Problem

  Alt 2. Aug 2007, 10:09
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Foreign Key Problem

  Alt 2. Aug 2007, 10:12
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
Heiko
  Mit Zitat antworten Zitat
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#6

Re: Foreign Key Problem

  Alt 2. Aug 2007, 10:42
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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