# JDBC insert mit select abfrage



## DR.Quest (21. Sep 2012)

Hallo Java-Gemeinde!

Ich möchte einen INSERT in meine DB machen und dabei einen Fremd-Schlüssel
über ein SELECT setzen. Ich nutze dazu ein PreparedStatement.

In meiner ersten Tabelle (nennen wir Sie einfach mal Customer) befindet sich
eine ID als "ID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY"

In meiner zweiten Tabelle (nennen wir Sie einfach mal Location) befindet sich
eine customer_id als "BIGINT UNSIGNED NOT NULL" und "FOREIGN KEY(customer_id) REFERENCES Customer(ID)"

Nun gut, ich möchte nun also mein PreparedStatement setzen und habe folgende 
Dinge ausprobiert:


```
statement.setString(1, "SELECT ID FROM Customer WHERE name = 'Smith'")
```

Das bewirkt einen org.h2.jdbc.JdbcSQLException: Datenumwandlungsfehler.

Und:


```
statement.setInt(1, "SELECT ID FROM Customer WHERE name = 'Smith'")
```

Funktioniert natürlich schon deshalb nicht, weil ich keinen String in nen int stecken kann.

Wie muss ich das also tun?


----------



## SlaterB (21. Sep 2012)

wie in jeder Anleitung zu PreparedStatement nachzulesen (wie kann man ohne anfangen?)
ist PreparadStatment allein dafür da, 
eine Query oder anderes a la
[sql]
select * from x where y = ?
[/sql]
vorzubereiten, 
das ? ist dabei ein Parameter für setString(1, ) usw, kann aber nur ein einzelner String, eine Zahl, eben ein Wert sein,
komplettes SQL oder auch nur einzelne Elemente wie Tabellen-/ Spaltenname/ Vergleichsoperator kommt nicht in Frage,


dass du überhaupt nur das setString(1, ) ohne die Query des PreparedStatements postest, erscheint seltsam

komplizierte SubQuerys musst du selber zusammenbauen, entweder im Voraus,
oder eben String-Baukasten hin zu einem neuen INSERT


----------



## DR.Quest (21. Sep 2012)

Ahhh.. verstehe... ich muss das hier schon erledigen:


```
INSERT INTO Location(customer_id, location)
SELECT ID FROM Customer WHERE name = ?
VALUES(?);
```

Und dann beim PreparedStatement sowohl den Namen als auch die Location setzen.

Habe ich das so nun richtig verstanden?


----------



## DR.Quest (21. Sep 2012)

bzw. 


```
INSERT INTO Location(customer_id, location)
VALUES(SELECT ID FROM Customer WHERE name = ?, ?);
```


----------



## SlaterB (21. Sep 2012)

puh, wie eine solche Verschachtelung fürs INSERT aussieht kann ich gar nicht sagen, 
[sql]
INSERT INTO Location(customer_id, location)
VALUES(SELECT ID FROM Customer WHERE name = ?, ?);
[/sql]
hätte ja auch was 
aber klingt bei dir überzeugt oder im Zweifel auszuprobieren/ nachzuschlagen,
(edit: jetzt postest du es auch)

die ? für die beiden einfachen Werte, ja


----------



## DR.Quest (21. Sep 2012)

Jo das funzt, 

danke dir SlaterB


----------

