0

MYSQL データベースに新しい行を挿入しようとしています。問題は、実際にはステートメントの準備に使用される挿入文字列をどのように構成するかです。挿入される新しい行には、別のテーブルから値を取得していた 1 つの列を除いて、新しい値があります。テストに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)

1 ではなく 6 つの疑問符を付けたので、これは驚くべきことです。値を?プレースホルダーに設定しているこれらの行の 2 行目にエラーが表示されます。

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

あなたは意味のないことをしようとしています。

最初に、挿入する意思を宣言します

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 に答える
0

両方の試みにはこれが含まれます:

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

あなたの電子メールは 1 つの値にのみ等しいことができます。多分あなたはこれを意味しました:

where EMAIL in (?,?,?,?,?,?)"
于 2013-04-20T13:14:08.217 に答える