当前位置: 首页 > 知识库问答 >
问题:

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

徐景明
2023-03-14

因此,我制作了一个注册页面,当我输入所有字段并单击signup提交时,enterNewUser(,,,),并将字段userId、username、password和role插入表user中。我通过运行select*from user来确认这一点;进入MYSQL工作台。

然后调用enterUsername(,,,),得到以下错误:

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

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;
}

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

创建表user(useridint(3)NOT NULL AUTO_INCREMENT,
usernamevarchar(20)默认NULL,passwordvarchar(20)默认NULL,rolevarchar(20)默认NULL,userid),
唯一键username(username));

创建表user_profile(useridint(3)NOT NULL默认值'0',firstnamevarchar(20)默认值NULL,lastnamevarchar(20)默认值NULL,userid),约束fk外键(userid)引用user(userid));

共有1个答案

蔡明贤
2023-03-14

不应该遵循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);
 类似资料:
  • 问题内容: 假设我有一个用户表,该列是主键并自动递增。 我只想尝试通过此语句手动添加用户: 但我不想指定值,只想添加到下一行。 谢谢大家,我忘记将id列设置为自动递增。它现在可以工作了。 问题答案: 所以就不要使用它…这样做 并确保您使用单引号进行插入 就像您说的字段是,SQL会自动将字段的值增加1

  • 问题内容: 我现在正在一家公司中使用全球DBA的无限智慧,他创建了一个表,该表将一个int用作ID字段,但是不会自动递增该数字。 我要从.Net传递一个表值参数,因为它随时有大约100或更多行的数据正在传递,并且我不想杀死该应用程序,破坏网络或SQL Server。 这是我的存储过程 我希望这会为我带来一些帮助,就像我对此进行测试时一样 这就是我回来的 (影响1行) (影响1行) (影响1行) (

  • 我正在使用PHP和MySQL。 将新行插入到具有自动递增 id 列的表中。 在插入此新行时,我想将新插入行的自动递增 id # 复制到同一行/条目中的另一列中。 创建时,新条目/行应具有自动递增的 id 列和具有相同编号的另一列。 我最大的担忧: 我需要所有这些都正确可靠地发生,即使来自其他连接的其他事务可能正在服务器上发生。 我对last_insert_id()知之甚少...我害怕能够可靠地使用

  • 现在我想从nodejs插入。我已经试过了,但不起作用

  • 问题内容: 关于如何从通过调用读取分配给新创建的记录的自动递增身份字段的任何建议? 我知道如何在多个数据库平台的SQL中执行此操作,但是我想知道存在哪些数据库独立接口来执行此操作,以及有关人们在整个数据库平台上的经验的任何输入。 问题答案: 以下代码片段应做ya’: 已知这可用于以下数据库 德比 的MySQL SQL服务器 对于不起作用的数据库(HSQLDB,Oracle,PostgreSQL等)