我正在尝试将新行插入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驱动程序在我看起来很好的时候会抱怨参数的数量。或者我在俯瞰什么?
答案 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 (?,?,?,?,?,?)"