JDBC insert mit select abfrage

  • Themenstarter Themenstarter DR.Quest
  • Beginndatum Beginndatum
D

DR.Quest

Gast
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:

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

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

Und:

Java:
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?
 
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
 
Ahhh.. verstehe... ich muss das hier schon erledigen:

Code:
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?
 
bzw.

Code:
INSERT INTO Location(customer_id, location)
VALUES(SELECT ID FROM Customer WHERE name = ?, ?);
 
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
 

Zurück
Oben