2013-04-20 55 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 (?,?,?,?,?,?)"