[Java]插入SQL时出错,表中的自动增量 - userId

时间:2015-10-03 16:19:03

标签: java mysql sql oauth insert

所以我正在创建一个注册页面,当我输入所有字段并单击注册提交时,将调用enterNewUser(,,,)并将字段userId,username,password和role插入到表User中。我通过将 select * from user; 运行到MYSQL工作台来确认这一点。

然后调用enterUsername(,,,)并收到此错误:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   在第1行'(3,'Barry','Allen')附近   com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你有一个   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本为正确的语法使用附近   '(3,'Barry','Allen')'在第1行

public static int enterNewUser(String username,String password, String role){
    //int userId = -1;
    int ID = 0;
    //int ID=-1;
    try{
        if(checkUserNameAvailable(username)==true){
            Class.forName("com.mysql.jdbc.Driver");
            cn = DriverManager.getConnection("jdbc:mysql://localhost/log", "root", "root");

            String q0 = "Select userId from user ORDER BY userId DESC LIMIT 1"; //get ID of last
            Statement st = cn.createStatement();
            ResultSet rs = st.executeQuery(q0);

            if(rs.next()){

                ID = rs.getInt("userId");
                ID++;
            }
            else
                ID=1; // Empty Table, so start with ID 1

            rs.close();
            st.close();

            String q1="insert into user values(?,?,?)";

            PreparedStatement ps = cn.prepareStatement(q1);
            //ps.setInt(1,ID);
            ps.setString(1,username);
            ps.setString(2,password);
            ps.setString(3,role); 
            ps.executeUpdate();
            ps.close();

        }
    }catch(Exception e){
        System.err.println(e.getMessage());
        e.printStackTrace();
    }
    DB_close();
    //if(userId!=-1)
    //  return userId;
    return -1;      
}
public static boolean enterUsername(int userId, String firstname, String lastname){
    try{
        Class.forName("com.mysql.jdbc.Driver");
        cn = DriverManager.getConnection("jdbc:mysql://localhost/log", "root", "root");

        //String q1="INSERT INTO user_profile values(?,?,?)";
        String q1 = "INSERT into user_profile (userId, firstname, lastname) VALUES (?,?,?)";

        PreparedStatement ps = cn.prepareStatement(q1);
        ps.setInt(1, userId);
        ps.setString (1, firstname);
        ps.setString (2, lastname);
        ps.executeUpdate();
        ps.close();
        return true;
    }catch(Exception e){
        System.err.println(e.getMessage());
        e.printStackTrace();
    }
    DB_close();
    return false;
}

这是我的数据库结构。

enter image description here user_profile user

编辑:发现问题,数据库结构不正确。

  

CREATE TABLE useruserId int(3)NOT NULL AUTO_INCREMENT,
  username varchar(20)DEFAULT NULL,password varchar(20)DEFAULT   NULL,role varchar(20)DEFAULT NULL,PRIMARY KEY(userId),

  UNIQUE KEY usernameusername));

     

CREATE TABLE user_profileuserId int(3)NOT NULL DEFAULT'0',   firstName varchar(20)DEFAULT NULL,lastName varchar(20)DEFAULT   NULL,PRIMARY KEY(userId),CONSTRAINT FK FOREIGN KEY   (userId)参考useruserId));

3 个答案:

答案 0 :(得分:0)

使用

String q1 = "INSERT into user_profile (firstname, lastname) VALUES (?,?)";

因为你的第一个字段是auto increment ..因此它会在插入值时自动递增值。

我推荐这种方式,

删除当前表并创建一个像这样的新表

   id-->int(30) (AUTO INCREMENT) NOTNULL  //Dont need to take care of this field

   USER_ID-->int(30) NOT NULL  //you should create your own ID and increment it before adding a new person

   username-->varchar(100)

   password-->varchar(100)

   role-->varchar(100)

通常,调用userId与您的代码完全相同,

String q0 = "Select userId from user ORDER BY USER_ID DESC LIMIT 1"; //get ID of last
        Statement st = cn.createStatement();
        ResultSet rs = st.executeQuery(q0);

        if(rs.next()){

            ID = rs.getInt("USER_ID ");
            ID++;
        }

答案 1 :(得分:0)

不应该按照方法enterUsername

中的部分进行操作
ps.setInt(1, userId);
ps.setString (1, firstname);
ps.setString (2, lastname);

是这样的

 ps.setInt(1, userId);
 ps.setString (2, firstname);
 ps.setString (3, lastname);

答案 2 :(得分:0)

我没有看到您发布的错误消息的原因。

但我看到其他一些看似问题的事情:

ps.setInt(1, userId);
ps.setString (1, firstname);
ps.setString (2, lastname);

索引是错误的:而不是1,1,2,它应该是1,2,3。 (坦率地说,我不知道代码可能如何发布。)

顺便说一句,这在其他方法中看起来也是错误的:

insert into user values(?,?,?)

由于该表有3列以上,您需要指定其名称, 就像你在enterUsername中所做的那样。