0

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

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

我认为插入字符串对于 MYSQL 是相同的,但它不起作用。我四处搜索并找到了这个答案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驱动程序在我看来很好时抱怨参数数量。或者我忽略了什么?

4

2 回答 2

0

您的两次尝试都包括:

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

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

where EMAIL in (?,?,?,?,?,?)"
于 2013-04-20T13:14:08.217 回答
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 关键字

于 2013-04-20T12:52:05.317 回答