Create table mit Fremdschlüssel

Coldstorm

Gesperrt
Hi...ich hab folgendes ER-Diagramm erstellt bis jetzt...siehe Anhang.
Nun möchte ich eine vierte Tabelle erstellen mit einem Primärschlüssel und zwei Fremdschlüsseln.
So sieht mein Ansatz aus...sollte eigentlich schon funktionieren, die Tabellenspalten heißen jeweils gleich, das war nach einer Forensuche bei einigen das Problem...
Aber beide Foreign Keys mag er nicht, ohnen denen geht es schon.

Code:
CREATE TABLE ueberweisung
     ( ID             INTEGER NOT NULL,
       KtoNr INTEGER,
       InhID INTEGER,
       UebDat DATE,
       Zweck           VARCHAR(120),
       PRIMARY KEY (ID),
       FOREIGN KEY (KtoNr)
               REFERENCES konto (KtoNr)
               ON DELETE RESTRICT,
       FOREIGN KEY (InhID)
               REFERENCES kontoinhaber (InhID)
               ON DELETE RESTRICT)
       ENGINE = INNODB;

Was ist falsch?
Meldung: #1005 - Can't create table 'onlinebanking.ueberweisung' (errno: 150)
Ich will es aber möglichst ohne Index machen.
 

Anhänge

  • ER.jpg
    ER.jpg
    20,7 KB · Aufrufe: 34
Zur Vollständigkeit halber hier noch ein DB-Dump:

Code:
--
-- Tabellenstruktur für Tabelle `bank`
--

CREATE TABLE IF NOT EXISTS `bank` (
  `BLZ` int(11) NOT NULL,
  `Bezeichnung` varchar(50) NOT NULL,
  `GruendDat` date NOT NULL,
  PRIMARY KEY (`BLZ`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `bank`
--


-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `konto`
--

CREATE TABLE IF NOT EXISTS `konto` (
  `KtoNr` int(11) NOT NULL,
  `Kontostand` decimal(10,0) NOT NULL,
  `BLZ` int(11) NOT NULL,
  `InhID` int(11) NOT NULL,
  PRIMARY KEY (`KtoNr`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `konto`
--


-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `kontoinhaber`
--

CREATE TABLE IF NOT EXISTS `kontoinhaber` (
  `InhID` int(11) NOT NULL,
  `Name` varchar(120) NOT NULL,
  `GebDat` date NOT NULL,
  `Wohnort` varchar(50) NOT NULL,
  PRIMARY KEY (`InhID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
Moin ColdStorm,

du versuchst, die neue "Überweisungstabelle" als InnoDB-Tabelle anzulegen UND gleichzeitig FK-Constraints auf andere myISAM-Tabellen einzurichten.

FKs wären von einer InnoDB aber nur auf andere InnoDBs möglich - was du versuchst ist so unvereinbar wie Westerwelle und englisch.

Abgesehen davon ist dein Datenmodell... *wie sag ichs meinem Kinde* ungewöhnlich.

In der "Konto"-Tabelle ist zwar ein Feld "InhID", aber ohne jedes FK-Constraint
Dagegen soll von den Überweisung sowohl auf "Konto" wie auf "Inhaber" jeweils ein -sozusagen einzeln gültiger FK gesetzt werden".

Hat Stevie Wonder bei euch modelliert in letzter Zeit?

Grüße
Biber
 
Zuletzt bearbeitet:
Es geht jetzt, InnoDB musste ich ändern.
Passt das so jetzt in etwa?
Code:
--
-- Datenbank: `Onlinebanking`
--

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `bank`
--

CREATE TABLE IF NOT EXISTS `bank` (
  `BLZ` int(11) NOT NULL,
  `Bezeichnung` varchar(50) NOT NULL,
  `GruendDat` date NOT NULL,
  PRIMARY KEY (`BLZ`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `bank`
--

INSERT INTO `bank` (`BLZ`, `Bezeichnung`, `GruendDat`) VALUES
(74067000, 'Postbank Essen', '1992-01-24'),
(86097000, 'Rottaler Raiffeisenbank eG', '1985-01-30');

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `konto`
--

CREATE TABLE IF NOT EXISTS `konto` (
  `KtoNr` int(11) NOT NULL,
  `Kontostand` decimal(10,0) NOT NULL,
  `BLZ` int(11) NOT NULL,
  `InhID` int(11) NOT NULL,
  PRIMARY KEY (`KtoNr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `konto`
--

INSERT INTO `konto` (`KtoNr`, `Kontostand`, `BLZ`, `InhID`) VALUES
(436882431, '7000', 86097000, 1),
(929582434, '2000', 74067000, 2);

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `kontoinhaber`
--

CREATE TABLE IF NOT EXISTS `kontoinhaber` (
  `InhID` int(11) NOT NULL,
  `Name` varchar(120) NOT NULL,
  `GebDat` date NOT NULL,
  `Wohnort` varchar(50) NOT NULL,
  PRIMARY KEY (`InhID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `kontoinhaber`
--

INSERT INTO `kontoinhaber` (`InhID`, `Name`, `GebDat`, `Wohnort`) VALUES
(1, 'Huber', '1986-01-01', 'Ruderting'),
(2, 'Schmid', '1985-01-09', 'Ruderting');

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `ueberweisung`
--

CREATE TABLE IF NOT EXISTS `ueberweisung` (
  `ID` int(11) NOT NULL,
  `KtoNr` int(11) DEFAULT NULL,
  `InhID` int(11) DEFAULT NULL,
  `UebDat` date DEFAULT NULL,
  `Zweck` varchar(120) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `InhID` (`InhID`),
  KEY `KtoNr` (`KtoNr`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Daten für Tabelle `ueberweisung`
--

INSERT INTO `ueberweisung` (`ID`, `KtoNr`, `InhID`, `UebDat`, `Zweck`) VALUES
(1, 436882431, 1, '2010-01-04', 'ebay Art. 442342'),
(2, 929582434, 2, '2010-01-13', 'Taschengeld'),
(3, 929582434, 1, '2010-01-07', 'Fahrschule 5423432'),
(4, 436882431, 2, '2010-01-09', 'SWP Nachzahlung');

--
-- Constraints der exportierten Tabellen
--

--
-- Constraints der Tabelle `kontoinhaber`
--
ALTER TABLE `kontoinhaber`
  ADD CONSTRAINT `kontoinhaber_ibfk_1` FOREIGN KEY (`InhID`) REFERENCES `ueberweisung` (`InhID`) ON UPDATE CASCADE;

--
-- Constraints der Tabelle `ueberweisung`
--
ALTER TABLE `ueberweisung`
  ADD CONSTRAINT `ueberweisung_ibfk_1` FOREIGN KEY (`KtoNr`) REFERENCES `konto` (`KtoNr`) ON DELETE SET NULL ON UPDATE CASCADE;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Die Constraints etc. sind jetzt eigentlich nicht meine Aufgabe. Ich wollte noch wegen etwas anderem Fragen, nämlich:
Angenommen ich würde das ER-Diagramm der Datenbank in das Klassendiagramm(Anhang) umwandeln wollen.
Welche Regeln muss ich beachten? Nur die theoretischen Regeln sind gefragt... hat da jemand eine Idee ?
 

Anhänge

  • klassendiagramm_oop.png
    klassendiagramm_oop.png
    21,8 KB · Aufrufe: 32
Moin Kaltstrom,

nein, es passt IMHO noch nicht, auch wenn es sich technisch jetzt so einrichten lässt.

Das Feld "InhID" gehört nicht in die "überweisungs"-Tabelle.
Denn der KontoInhaber ist (bei dem eindimensionalen Zeitbezug, den du nur hast) immer schon zwingend von der KontoID abhängig.

Und in der "konto"-Tabelle steht das Feld ja auch richtigerweise.

Ich weiß nicht, was dich bewogen hat, diese Feld bei den Überweisungen mitzuschleifen.
Falls du den Businesscase "Der Inhaber einer Kontonummer kann sich ja mal ändern" dadurch vorsehen wolltest... das geht in deiner Struktur ohne Zeitbezug, ohne GültigVon/GültigBis ohnehin nicht.

Grüße
Biber
 
Zuletzt bearbeitet:
Zurück