Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JDBC和MySQL添加行时出现问题?_Java_Mysql_Exception_Jdbc - Fatal编程技术网

Java 使用JDBC和MySQL添加行时出现问题?

Java 使用JDBC和MySQL添加行时出现问题?,java,mysql,exception,jdbc,Java,Mysql,Exception,Jdbc,我使用JDBC与MySQL同步,向MySQL数据库的表中添加和定义行。问题是,当我使用ResultSet类中的方法向表中添加行时,我不知道为什么它会抛出异常。请记住,我之前尝试过通过ResultSet方法读取表格,它成功地打印出了单元格值。以下是相关的代码框架: public void run(){ try { Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.g

我使用JDBC与MySQL同步,向MySQL数据库的表中添加和定义行。问题是,当我使用
ResultSet
类中的方法向表中添加行时,我不知道为什么它会抛出
异常。请记住,我之前尝试过通过
ResultSet
方法读取表格,它成功地打印出了单元格值。以下是相关的代码框架:

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();}
这是控制台:

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)
[更新]


在将
id
列作为
INTEGER AUTO_INCREMENT主键添加到表中之后,
ResultSet
成功地将行添加到表中,现在,我只想知道,如果
id
列不在表中,为什么MySQL不接受从
ResultSet
添加新行的请求

如果不在表中设置主键,则使用Mysql的JDBC 2.X API在更新模式下无法工作。

是否为真:“引用的表没有主键”?我将使用PK(如GUID)设置表,看看这是否有帮助@Boden Yes。这不是玩笑。就像我提到的,我试着只使用while循环,它正确地打印了单元格!你的意思是说我需要创建另一个名为“id”的专栏?但是为什么,因为我已经存在的数据库处理代码不打算处理另一个名为“id”的列?您能告诉我主键到底是什么吗?关系表的主键唯一地标识表中的每个记录。它可以是保证唯一的普通属性(如每人不超过一条记录的表中的社会保险号),也可以由DBMS生成(如Microsoft SQL Server中的全局唯一标识符或GUID)。主键可以由单个属性或组合的多个属性组成。因此,您能告诉我如何在(我猜)每个单元格中插入主键。@Catfish:主键通常是表中的一列。您需要创建一个唯一标识每一行的新列。由于您似乎正在使用图书,您可以尝试将ISBN列设置为主键。“alter table MYTABLE add primary key(KEYFIELD)”,其中MYTABLE是表的名称,KEYFIELD是用作键的字段的名称。如果要使用自动递增键,必须首先使用类似“alter table MYTABLE add column KEYFIELD integer auto_increment”的语句创建键字段。或者,您可以使用“ALTERTABLE MYTABLE add column KEYFIELD integer auto_increment主键”一次完成这一切。有关更多信息,请阅读有关create语句和键的文档。