2013-04-20 58 views
0

我試圖在MYSQL數據庫中插入新行。問題實際上是如何構造用於準備語句的插入字符串。插入的新行具有新值,除了一列從另一個表中獲取其值。我使用H2進行測試,這就是我如何構建字符串。對使用​​JDBC的Mysql插入語句感到困惑

"INSERT INTO RESERVATION CUSTOMER_CODE,ROOM_NUMBER,RESERVATION_DATE,START_DATE,END_DATE, 
    TOTAL_PRICE) values(select CUSTOMER_CODE FROM CUSTOMER where EMAIL=?,?,?,?,?,?)" 

我認爲插入字符串對於MYSQL是相同的,但它不工作。我google搜索,發現這個答案https://stackoverflow.com/a/26080/1788917。所以我改變了字符串;

"INSERT INTO RESERVATION 
CUSTOMER_CODE,ROOM_NUMBER,RESERVATION_DATE,START_DATE,END_DATE, 
    TOTAL_PRICE) select CUSTOMER_CODE FROM CUSTOMER where EMAIL=?,?,?,?,?,?" 

我認爲它以某種方式工作,因爲錯誤發生了變化。但是現在MYSQL驅動程序告訴我還有一個錯誤。不知何故,就好像引號超過了要求。這是錯誤

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your 
    SQL syntax; check the manual that corresponds to your MySQL server version for the 
    right syntax to use near ''A13','2013-04-20','2013-04-20','2013-04-24',14000.0' 
    at line ... 

這意味着它已獲得的第一個值(CUSTOMER_CODE)從另一個表,但其餘值正確均以在一起是什麼困擾着我。我如何解決這個問題...

我的錯誤在哪裏?

我決定編寫一個方法,讓我的客戶代碼,以便我可以插入語句沒有任何選擇查詢。字符串現在看起來是這樣

"INSERT INTO RESERVATION 
(CUSTOMER_CODE,ROOM_NUMBER,RESERVATION_DATE,START_DATE,END_DATE,TOTAL_PRICE) 
values(?, ?, ?, ?, ?, ?)" 

但現在MySQL的驅動抱怨這樣的...

java.sql.SQLException: Parameter index out of range (2 > number of parameters, which 
    is 1). at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) 

,因爲我已經把6問號,而不是1 這是令人驚訝的錯誤出現在這些行的第二行,我將值設置爲?佔位符。

preStatement.setLong(1, customer.getCustomerCode()); 
preStatement.setString(2, reservation.getRoomNumber()); 
preStatement.setDate(3, reservation.getReservationDate()); 
preStatement.setDate(4, reservation.getStartDate()); 
preStatement.setDate(5,reservation.getEndDate()); 
preStatement.setDouble(6, reservation.getTotalPrice()); 

那麼爲什麼MYSQL驅動程序在向我看好的時候抱怨參數的數量。或者我忽略了什麼?

+1

如果只有你可以閱讀錯誤信息......也許它解釋了什麼問題是什麼? – 2013-04-20 12:52:13

+0

@ JB Nizet,幾乎在任何時候這個消息都很有幫助,但是這一次它以不同的語言發言 – Obby 2013-04-20 13:04:15

+0

您是否嘗試過使用第一條語句,但將內部select語句包裝到括號中? – 2013-04-20 13:07:16

回答

0

你正試圖做一些毫無意義的事情。

首先你宣佈你打算插入

CUSTOMER_CODE,ROOM_NUMBER,RESERVATION_DATE,START_DATE,END_DATE, TOTAL_PRICE 

但是你只提供1個值 CUSTOMER_CODE

如果去會是這樣的

INSERT INTO RESERVATION 
CUSTOMER_CODE,ROOM_NUMBER,RESERVATION_DATE,START_DATE,END_DATE,TOTAL_PRICE) 
select CUSTOMER_CODE,ROOM_NUMBER,RESERVATION_DATE,START_DATE,END_DATE,TOTAL_PRICE where EMAIL=?; 

或者,方式你知道值

INSERT INTO RESERVATION 
CUSTOMER_CODE,ROOM_NUMBER,RESERVATION_DATE,START_DATE,END_DATE,TOTAL_PRICE) 
VALUES(?, ?, ?, ?, ?, ?); 

最後,您聲明到INSERT的元素數量必須與您插入的VALUES相等,可以顯式聲明值(使用VALUE關鍵字),也可以來自SELECT查詢,在這種情況下,你不能使用VALUE關鍵字

+0

這些列不是來自'CUSTOMER'表,只有'RESERVATION'表。它只是從'CUSTOMER'表格 – Obby 2013-04-20 13:00:38

+0

中檢索到的'customer_code'不夠公平,但是不要聲明要插入這些列或爲它們聲明虛擬/空值。 – 2013-04-20 13:06:13

0

無論你嘗試包括這樣的:

where EMAIL=?,?,?,?,?,?" 

您的郵箱只能等於1倍的值。也許你的意思是這樣的:

where EMAIL in (?,?,?,?,?,?)"