我是新手程序员,以下是我的代码的一部分,用于将数据插入名称为 book_details 的数据库中。
try{
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
//STEP 3: Open a connection
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "INSERT INTO issue_details VALUES("+BookIDvar+",'"+StudentIDvar+"','"+StudentNamevar+"')";
stmt.executeUpdate(sql);
sql = "INSERT INTO book_details (book_status) VALUES ('notavailable') WHERE book_id = "+BookIDvar+"";
// there are 4 fields in the database. I wish to insert the string 'notavailable' into the 4th field which is named book_status for a particular BookID
stmt.executeUpdate(sql);
//STEP 6: Clean-up environment
stmt.close();
conn.close();
}catch(SQLException se){
//Handle errors for JDBC
se.printStackTrace();
}catch(Exception e){
//Handle errors for Class.forName
e.printStackTrace();
}finally{
//finally block used to close resources
try{
if(stmt!=null)
stmt.close();
}catch(SQLException se2){
}// nothing we can do
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}//end finally try
}
在这里,我打算更新可用但不可用的图书馆书籍的状态。由于其他一些原因,我更喜欢非布尔值。
执行后, book_details 数据库未更新。它也会出错
MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
。
Sql语句有问题还是别的什么?其他位置的同一数据库上的其他操作工作正常。
答案 0 :(得分:4)
这种SQL语法错误:
INSERT INTO <table> VALUES <values> [WHERE <whatever>]
您无法在WHERE
中添加INSERT
。
在WHERE
中添加INSERT
语句的唯一情况是从SELECT
语句的结果中插入数据,而WHERE
是SELECT
的一部分{1}}。例如:
INSERT INTO <table> [SELECT <columns> FROM <tables> WHERE <conditions>]
在此表单中,SELECT
中获取的列必须与要在表中插入的值匹配。
您希望更新图书的状态。您应该使用UPDATE
语句而不是INSERT
:
UPDATE <table> SET (<column> = <value>) (supports multiple columns) WHERE <conditions>
将此应用于您的上下文,语句应为:
UPDATE book_details SET book_status = 'notavailable' WHERE book_id = ?
此外,由于这是 all或nothing 事务,因此如果所有语句都成功执行,则应打开事务并提交,否则执行回滚。您可以这样做:
try {
conn.setAutoCommit(false);
//perform the DML statements
//...
//commit the transaction
conn.commit();
} catch (Exception e) {
//in case of error, rollback the transaction
conn.rollback();
//notify the error
e.printStacktrace();
} finally {
//ALWAYS close the connection here
//handle the exceptions and such
conn.close();
}
请注意,当您需要将参数传递给SQL语句时,应使用PreparedStatement
而不是Statement
,因为连接查询可能会导致SQL Injection attacks。代码应如下所示:
sql = "INSERT INTO issue_details VALUES(?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, BookIDvar);
pstmt.setString(2, StudentIDvar);
pstmt.setString(3, StudentNamevar);
pstmt.executeUpdate();
//similar for other SQL statements
更多信息:
答案 1 :(得分:3)
正如Luggi所说,这是不正确的。
update book_details set book_status = 'notavailable' where book_id = bookIDvar;
假设它已经存在于表中。
如果没有,
insert into book_details (book_id, book_status) values (bookIDvar, 'notavailable');