# Kontroll-Logik MySQL in XAMPP: Zusammengesetzter Primarschlüssel aus Fremdschlüsseln



## stoevinho (14. Apr 2012)

Hallo Forumgemeinde!

Folgendes:

3 Tabellen; in den ersten zwei Tabellen jeweils ein Primärschlüssel. Tabelle drei referenziert die Beziehung zwischen Tabelle eins und zwei. Tabelle drei enthält 2 Primärschlüssel (zusammengesetzt) und die einzelnen Schlüssel sind Fremdschlüssel.

Wenn ich ein INSERT VALUES mache, mit schlüsseln, die es in keiner Tabelle gibt, dann macht der das trotzdem erfolgreich. Er kontrolliert nicht die Logik. Derjenige der den Insert macht muss kontrollieren ob die Daten existieren, oder? Also die DB/MySQL/XAMPP-Apache kontrolliert das nicht, oder?


```
DROP TABLE IF EXISTS `ap`;
CREATE TABLE IF NOT EXISTS `ap` (
  `ap_id` smallint(6) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`ap_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
```


```
CREATE TABLE IF NOT EXISTS `if1` (
  `if_id` smallint(6) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`if_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
```


```
DROP TABLE IF EXISTS `ap-if`;
CREATE TABLE IF NOT EXISTS `ap-if` (
  `ap_id` smallint(6) ,
  `if_id` smallint(6) ,
PRIMARY KEY (`ap_id`,`if_id`),
 FOREIGN KEY (`ap_id`) references ap(`ap_id`),
 FOREIGN KEY (`if_id`) references if1(`if_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
```

Irre ich mich, oder muss ich die Logik implementieren? Dachte immer, dass bei einem insert die DB kontrolliert ob das auch legal ist (also nicht nur den Datentyp sondern auch den Gültigkeitsbereich des  Wertes...). :rtfm:


Vielen Dank im Voraus für jeden Tipp! 

Schönes Wochenende euch noch!


----------



## Final_Striker (14. Apr 2012)

stoevinho hat gesagt.:


> Irre ich mich, oder muss ich die Logik implementieren?



Nein, normalerweise sollte es eine Fehler geben, wenn du ID's verwendest die nicht in den Haupttabellen existieren.

Probiere es mal den Primarykey ans Ende zu stellen, wobei eigentlich nicht daran liegen sollte


```
DROP TABLE IF EXISTS `ap-if`;
CREATE TABLE IF NOT EXISTS `ap-if` (
  `ap_id` smallint(6) ,
  `if_id` smallint(6) ,
 FOREIGN KEY (`ap_id`) REFERENCES ap(`ap_id`),
 FOREIGN KEY (`if_id`) REFERENCES if1(`if_id`),
 PRIMARY KEY (`ap_id`,`if_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
```


----------



## TheDarkRose (14. Apr 2012)

*ENGINE=MyISAM*

Mich wundert es, dass du beim Erstellen der Tabellen keinen Fehler bekommst, denn soweit ich in Erinnerung habe unterstützt MyISAM Schlüsselbeziehungen nicht. Verwende mal InnoDB!


----------



## nillehammer (14. Apr 2012)

TheDarkRose hat gesagt.:
			
		

> Mich wundert es, dass du beim Erstellen der Tabellen keinen Fehler bekommst, denn soweit ich in Erinnerung habe unterstützt MyISAM Schlüsselbeziehungen nicht.


Das stimmt. MyIsam ignoriert die Fremdschlüsselbeziehungen aber einfach nur. Es schmeißt keinen Fehler beim Erstellen der Tabellen. Wenn man referenzielle Integrität auf Datenbankebene will, ist auch der zweite Tipp von TheDarkRose richtig:


			
				TheDarkrose hat gesagt.:
			
		

> Verwende mal InnoDB!


... oder einen anderen Typ, der referenzielle Integrität unterstützt.


----------



## stoevinho (20. Mai 2012)

Hallo,

vielen Dank für die Tipps!!! Habe es auf InnoDB geändert.


Aber es geht immer noch nicht. Bekomme jetzt den Error:


> #1005 - Can't create table 'db.ap_if' (errno: 150) (<a href="server_engines.php?engine=InnoDB&amp;page=Status&amp;token=56cedf7cab72d767ed6cfbf7d0191177">Details ...</a>)




Bin dem Fehler auf MySQL :: MySQL 5.5 Reference Manual :: 14.3.5.4 FOREIGN KEY Constraints gefolgt. Dort wird ja beschrieben was der Fehler beinhaltet aber ich checks beim Besten willen nicht wo mein Fehler liegen könnte?!?!

Muss ich beim erstellen der anderen Tabellen (ap, if) noch was einfügen? Vll etwa bei den Schlüssen? So etwas wie UNIQUE? Oder INDEX?

Was mir auch nicht geholfen hat war:

```
CREATE TABLE IF NOT EXISTS ap_if(
...
foreign key (ap_id) references ap(ap_id) ON DELETE CASCADE,
foreign key (if_id) references if1(if_id) ON DELETE CASCADE
) ENGINE=InnoDB ;
```


Bin für jeden Tipp zu haben! 

 Vielen Dank im Voraus!!


----------



## stoevinho (21. Mai 2012)

InnoDB muss zu erst aktiviert werden.

Siehe: How to Enable MySQL InnoDB Storage Engine on XAMPP | All About Web & Mobile Application Development

Aber wenn ich die Zeilen reinnehmen kann ich den MySQL Server nimma starten. Habt ihr damit Erfahrungen? Geht das bei euch einfach so ohne Fehlermeldungen?

"Konnte den Vorgang nich beenden Fehler-1" .. oder sowas kommt da bei mir


----------

