使用JDBC混淆了Mysql Insert语句

时间:2013-04-20 12:43:47

标签: mysql sql jdbc insert

我正在尝试将新行插入MYSQL数据库。问题实际上是如何构造用于准备语句的插入字符串。正在插入的新行具有新值,除了从另一个表获取其值的一列。我正在使用H2进行测试,这就是我构建String的方式。

"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语句。字符串现在看起来像这样

"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驱动程序在我看起来很好的时候会抱怨参数的数量。或者我在俯瞰什么?

2 个答案:

答案 0 :(得分: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的元素数量必须与您插入的值相等,可以显式声明值(使用VALUE关键字),也可以来自SELECT查询,在哪种情况下,您不得使用VALUE关键字

答案 1 :(得分:0)

你的两次尝试都包括:

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

您的电子邮件只能等于一个值。也许你是这个意思:

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