# MySQL Insert Befehl mit Fremdschlüssel



## Brus-xy (21. November 2012)

Hallo Leute, 
ich habe, für euch sicherlich sehr trivial, für mich aber doch ein etwas kompliziertes Problem.

Und zwar benötige ich einen Insert Befehl, der in eine Datenbank in die Haupttabelle mit den Spalten *Wert1* und *tag_id* Werte einfügt. 

Es gibt eine weitere Tabelle (Tabellenname: tage) in der die Spalten *tag_id*, *tag* aufgelistet sind. Mit den Inhalten:

ID Tag
0 Montag
1 Dienstag
2 Mittwoch 

usw.

Jetzt möchte ich über den Insert Befehl nur einen Wert und einen Wochentag (also ausgeschrieben z.B.  999, Montag) in die Haupttabelle eingeben, eingetragen werden soll aber der Wert und die zugehörige ID (die über die Tabelle tage ermittelt werden muss). Also 999, 0

Die beiden Tabellen sind InnoDB Tabellen und tag_id in der Haupttabelle ist als Fremdschlüssel der tag_id in der Tabelle tage verknüpft.


----------



## tombe (21. November 2012)

Wenn mich nicht alles täuscht dann so:


```
INSERT INTO
    haupt_tabelle (Wert1, tag_id)
    VALUES(999, (SELECT tag_id FROM tage WHERE tag = 'Montag'))
```


----------



## BaseBallBatBoy (21. November 2012)

So wie tombe das beschreibt sollte es klappen. 

Aber zwei Dinge sollte man dabei noch beachten:
1. Der select darf nur genau 1 record zurückliefern
2. Entweder in der Applikation sicherstellen, dass nur Werte eingegeben werden können die es in der Tabelle tage gibt, oder aber das Select in ein IF((SELECT...) IS NULL,-1, tag_id) oder COALESCE verpacken um NULL Werte zu verhindern. Wahrscheinlich ist tag_id eh NOT NULL, falls also bei einer Fehleingabe NULL daherkommt würde dir die Query um die Ohren fliegen.


----------



## tombe (21. November 2012)

Da hat BaseBallBatBoy recht!

Damit der User nichts falsches eingeben kann, würde ich die Wochentage in eine Auswahlliste eintragen.

Entweder aus der Tabelle "tage" auslesen oder weil sich da ja nichts ändern kann fest im HTML Code eingeben. Der VALUE-Eigenschaft kann dann gleich die Zahl zugewiesen werden und es wird so gespeichert wie es sein soll.


----------



## Brus-xy (21. November 2012)

Danke euch beiden für die schnelle Hilfe, das mit dem Abfangen von ungültigen Einträgen werde ich berücksichtigen!!


----------



## timestamp (21. November 2012)

tombe hat gesagt.:


> weil sich da ja nichts ändern kann fest im HTML Code eingeben. Der VALUE-Eigenschaft kann dann gleich die Zahl zugewiesen werden und es wird so gespeichert wie es sein soll.



Hihihi, dann komme ich daher und bin böse und feuere mein eigenes HTML-Formular ab 
Nutzereingaben *IMMER* validieren.


----------



## tombe (22. November 2012)

@timestamp: Ich habe nicht geschrieben das die so gemachten Eingaben nicht validiert werden müssen!
Ich finde es nur unnötig eine Tabelle anzulegen in der Montag, Dienstag, ..., Sonntag zusammen mit einem Index steht und das dann per Abfrage auszulesen und in eine Auswahlliste einzutragen.

Die wenigen Daten könnte man einfach so:


```
<select name="tage" size="1">
    <option value="-1" selected="selected">Wochentag ausw&auml;hlen</option>
    <option value="0">Montag</option>
    <option value="1">Dienstag</option>
    <option value="2">Mittwoch</option>
    <option value="3">Donnerstag</option>
    <option value="4">Freitag</option>
    <option value="5">Samstag</option>
    <option value="6">Sonntag</option>
</select>
```

fest in die Seite eintragen. Hier kann sich nichts ändern da es nunmal nur Montag bis Sonntag gibt!


----------

