Java 数据不完整';t被插入到我的SQL表中,但它';也就是说';重复的主键

Java 数据不完整';t被插入到我的SQL表中,但它';也就是说';重复的主键,java,mysql,mysql-workbench,Java,Mysql,Mysql Workbench,所以我只是想让注册用户的数据显示在SQL表中。我知道我已成功连接到数据库,但没有添加任何数据。我不知道这是为什么。当我运行代码时,我得到一个关于主键的重复条目“username”的SQLException。这是密码 public void createUser() throws SQLException{ String query = " INSERT INTO users(username, password, name, email)" + " VALUES

所以我只是想让注册用户的数据显示在SQL表中。我知道我已成功连接到数据库,但没有添加任何数据。我不知道这是为什么。当我运行代码时,我得到一个关于主键的重复条目“username”的SQLException。这是密码

public void createUser() throws SQLException{

    String query = " INSERT INTO users(username, password, name, email)"
            + " VALUES(?, ?, ?, ?)";
    PreparedStatement statement = db.getConn().prepareStatement(query);
    statement.setString(1, String.valueOf(username));
    statement.setString(2, String.valueOf(password));
    statement.setString(3, String.valueOf(name));
    statement.setString(4, String.valueOf(email));

        statement.executeUpdate();
      //  error is here
        statement.close();
        db.getConn().commit();
        System.out.println("success");

}
我可以打印出所有用户名/密码/姓名/电子邮件内容,没问题。在
语句.executeUpdate()行中抛出错误

这是正在创建的数据库

CREATE TABLE `users` (
`username` VARCHAR(45) NOT NULL,
`password` VARCHAR(45) NOT NULL, 
`name` VARCHAR(45) NOT NULL,
`email` VARCHAR(45) NOT NULL,
PRIMARY KEY(`username`))
COMMENT = "this is a test table";
我可以在MySQLWorkbench上插入数据,没有问题,我可以做
描述用户
并查看包含在工作台中手动创建的用户的表,但我不确定java方法为什么不起作用。谢谢你的时间


编辑:更改自
语句.setString(1,“用户名”)
to
statement.setString(1,String.valueOf(username))等等。但是我现在得到一个数据截断错误<代码>数据截断:第1行的“用户名”列的数据太长,请检查表
user
,如果有
username
值为“1”,请将其删除,然后重试。

错误是在语句中插入的是固定值,而不是预期值

statement.setString(1, "username");
    statement.setString(2, "password");
    statement.setString(3, "name");
    statement.setString(4, "email");
变量名周围不应该有引号。E、 g:

statement.setString(1, username);
    statement.setString(2, password);
    statement.setString(3, name);
    statement.setString(4, email);

这是因为username是您的主键,您正试图将重复记录插入到username列的表中。
检查您尝试插入的用户名是否已存在于表中

您可以尝试一些方法来进一步调试它

1) 尝试在statement.setString()方法中传递字符串值,以确认db调用已到位

public void createUser()引发SQLException{

String query = " INSERT INTO users(username, password, name, email)"
        + " VALUES(?, ?, ?, ?)";
PreparedStatement statement = db.getConn().prepareStatement(query);
statement.setString(1, "Test");
statement.setString(2, "Test");
statement.setString(3, "name");
statement.setString(4, "abc@abc.com");

    statement.executeUpdate();
  //  error is here
    statement.close();
    db.getConn().commit();
    System.out.println("success");
}

2) 在调用statement.setString()之前,请尝试打印username的值,并选中


3) 检查表中的现有数据,可能您正试图输入重复的记录。因为用户名是表的主键。

感谢您的关注。我刚刚将其更改为
statement.setString(1,String.valueOf(username))等等,但我现在得到了数据截断错误<代码>数据截断:第1行“用户名”列的数据太长says@user10871827如果变量已经是字符串,则不需要使用valueOf()。您需要对试图插入到语句中的所有值执行此操作,但此时每次执行查询时都要插入“用户名、密码、姓名、电子邮件”。@user10871827刚刚看到您的编辑,用户名是否少于45个字符?我刚刚算出来。我需要执行
statement.setString(1,username.getText())因为它是从文本字段抓取的。所以我们的想法是用户在这个页面上注册,他们将插入数据来完成这个过程。我主要是这样写的,以建立和测试插入过程。我可能会尝试使用for循环或其他方法来设置我准备好的语句,因为我认为这样做会更有效。你脑子里有什么想法吗?谢谢你的帮助!Np,我建议设置变量,比如
stringusername=username.getText()甚至使用getter和setter。这将使它更容易使用,因为我建议对从文本字段传递的数据进行验证。