views:

229

answers:

1

I'm using JDBC in sync with MySQL to add and define rows to a MySQL database's Table. The problem is that I don't know why it is throwing an Exception when I use methods from the ResultSet class to add rows to the table. Bear in mind that I've earlier tried just reading the table via ResultSet methods, and, it successfully printed out the cell values. The following is the concerned code fragement:

public void  run(){
 try {
  Class.forName("com.mysql.jdbc.Driver");
  Connection con = DriverManager.getConnection(     
    "jdbc:mysql://localhost:3306/temp_book_database","root","1234");   

  ResultSet set = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE).executeQuery("SELECT * FROM book_info");


  set.moveToInsertRow();
  set.updateString(1, "Osama's POV"); set.updateString(2, "Osama B Laden"); 
  set.updateInt(3, 2800); set.updateString(4, "Osama bin Laden's debute book on terrorism");
  set.insertRow(); set.moveToCurrentRow();set.beforeFirst();
  //I'm guessing the bottom while loop is not executed because the above is generating the Exception
  while (set.next()){
   System.out.println(set.getString("Book_Title")+ set.getString("Book_Author")+ set.getString("MRP")+set.getString("Comments"));
  }

 } catch (ClassNotFoundException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 } catch (Exception e){System.out.println("prob with code");
 e.printStackTrace();}

And this is the Console:

prob with code
com.mysql.jdbc.NotUpdatable: Result Set not updatable (referenced table has no primary     keys).This result set must come from a statement that was created with a result set type of     ResultSet.CONCUR_UPDATABLE, the query must select only one table, can not use functions and must select all primary keys from that table. See the JDBC 2.1 API Specification, section 5.6 for more details.
at com.mysql.jdbc.UpdatableResultSet.moveToInsertRow(UpdatableResultSet.java:1013)
at testJDBCDriver.run(testJDBCDriver.java:21)
at testJDBCDriver.main(testJDBCDriver.java:9)

[UPDATE]

After adding the id column in the table as INTEGER AUTO_INCREMENT PRIMARY KEY the ResultSet successfully added the row to the table, now, I just want to know why MySQL doesn't accept request to add new row from ResultSet if the id column isn't present in the table?

+2  A: 

Hello,

The JDBC 2.X API with Mysql doesn't work in update mode if you don't set primary key in the table.

Arnaud
could you tell me what exactly *is* primary key?
Catfish
The primary key of a relational table uniquely identifies each record in the table. It can either be a normal attribute that is guaranteed to be unique (such as Social Security Number in a table with no more than one record per person) or it can be generated by the DBMS (such as a globally unique identifier, or GUID, in Microsoft SQL Server). Primary keys may consist of a single attribute or multiple attributes in combination.
Anthony Forloney
So could you tell me how to insert Primary Keys inside (I guess) each cell.
Catfish
@Catfish: A primary key is typically a single column in a table. You need to create a new column that uniquely identifies each row. Since you appear to be working with books, you might try setting your ISBN column to be the primary key.
spork
"alter table MYTABLE add primary key (KEYFIELD)", where MYTABLE is the name of the table and KEYFIELD is the name of the field you are using as a key. If you want to use an auto-incrementing key, you'll have to first create the key field with a statement like "alter table MYTABLE add column KEYFIELD integer auto_increment". Or you could do it all at once with "alter table MYTABLE add column KEYFIELD integer auto_increment primary key". Read the documentation on create statements and keys for more info.
Jay