将值插入sqlite表会导致错误:[SQLITE_CONSTRAINT]因约束违规而中止(UNIQUE约束失败:salesman.code)

时间:2016-05-19 07:09:13

标签: java sqlite csv

我用mysql db创建了一个功能齐全的java应用程序。我必须将mysql数据库更改为sqlite数据库,以使应用程序更具可移植性(无需安装)。我正在将所有mysql表和值转换为sqlite。

我是创建数据库和表格,现在,我从用户通过FileChooser选择的.csv文件填充我的salesman表。用户选择将填充salesman表的.csv文件后,NetBeans将导致此错误:

java.sql.SQLException: [SQLITE_CONSTRAINT]  Abort due to constraint violation (UNIQUE constraint failed: salesman.code)
at org.sqlite.core.DB.newSQLException(DB.java:890)
at org.sqlite.core.DB.newSQLException(DB.java:901)
at org.sqlite.core.DB.execute(DB.java:810)
at org.sqlite.core.DB.executeUpdate(DB.java:847)
at org.sqlite.jdbc3.JDBC3PreparedStatement.executeUpdate(JDBC3PreparedStatement.java:86)

在研究类似问题之后,这意味着我在salesman表中放置的值与使用salesman表设置的参数/约束不对齐。但是当我创建表时,我没有放任何UNIQUE约束。我使用Browser for SQLite创建了表,这是用于创建数据库和表的代码:

 try {
        Class.forName("org.sqlite.JDBC");
        conn = DriverManager.getConnection("jdbc:sqlite:sandapp.db");
        String createSalesmanQuery = "CREATE TABLE IF NOT EXISTS salesman (\n" +
                "    code INTEGER PRIMARY KEY\n" +
                "                 NOT NULL,\n" +
                "    name TEXT    NOT NULL\n" +
                ")\n" +
                "WITHOUT ROWID;";

        ps = conn.prepareStatement(createSalesmanQuery);
        ps.executeUpdate();

        String emptySalesmanQuery = "DELETE FROM salesman;"; //empties if there are contents
        ps = conn.prepareStatement(emptySalesmanQuery);
        ps.executeUpdate();
    } catch ( Exception e ) {
        System.err.println( e.getClass().getName() + ": " + e.getMessage() );
        System.exit(0);
    }

约束WITHOUT ROWID存在,因为属性code来自另一个数据库,因此不应该是自动递增的表ID。我已经检查了.csv文件,其中列codes的所有值都是,并且没有重复值。此文件也用于mysql db并成功上传。有人有主意吗?

编辑:这是我从.csv文件中获取销售员详细信息的方法

public static String getSalesmanFromFile(String filePath){
    ArrayList<Salesman> salesmanList= new ArrayList<Salesman>();
    String status = null;
    try {
        BufferedReader br = new BufferedReader(new FileReader(filePath));
        String line = null;
        String[] strSalesman = null;
        try {
            Class.forName("org.sqlite.JDBC");
            Connection connection =  DBConnection.getConnection();
            PreparedStatement ps = null;

            while ((line=br.readLine()) != null){
                strSalesman = line.split(",");
                salesmanList.add(new Salesman(Integer.parseInt(strSalesman[0]), strSalesman[1]));

                String insertSalesmanQuery = "INSERT INTO salesman VALUES(?, ?);";
                ps = connection.prepareStatement(insertSalesmanQuery);

                for(int i = 0; i<salesmanList.size(); i++){
                    ps.setInt(1, salesmanList.get(i).getCode());
                    ps.setString(2, salesmanList.get(i).getName());
                    ps.executeUpdate();
                }
                status = "Successfully uploaded";
            }
            ps.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
           ex.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
        status = "Error"; //- Please review file selected. Make sure that format is followed.";
        System.out.println(status);
    }
    return status;

以下是.csv文件中的销售员详细信息示例:

5099    JONATHAN REYES
5010    EDWIN DAVID

这两个值在NetBeans的输出日志中返回上述错误。

0 个答案:

没有答案