Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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 准备好的语句不工作,但在mysql中更新工作时在终端中写入_Java_Mysql_Prepared Statement_Primary Key - Fatal编程技术网

Java 准备好的语句不工作,但在mysql中更新工作时在终端中写入

Java 准备好的语句不工作,但在mysql中更新工作时在终端中写入,java,mysql,prepared-statement,primary-key,Java,Mysql,Prepared Statement,Primary Key,我正在尝试使用prepared语句更新表,但出现错误: ERROR fremad.dao.JdbcUserDao - com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '21' for key 'PRIMARY' 我真的不明白,因为我没有尝试添加更多行 这是表格: CREATE TABLE `user_meta` ( `user_id` INT(16)

我正在尝试使用prepared语句更新表,但出现错误:

ERROR fremad.dao.JdbcUserDao - com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '21' for key 'PRIMARY'
我真的不明白,因为我没有尝试添加更多行

这是表格:

CREATE TABLE `user_meta` (
     `user_id` INT(16) NOT NULL , 
     `first_name` VARCHAR(32) NOT NULL , 
     `last_name` VARCHAR(32) NOT NULL , 
     `phone_number` VARCHAR(16) , 
     `birthday` DATE , 
     `home_town` VARCHAR(32) , 
     `profession` VARCHAR(32) , 
     CONSTRAINT `fk_user_meta_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
    PRIMARY KEY ( `user_id` )
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这就是功能:

@Override
public UserMetaObject updateUserMeta(UserMetaObject userMetaObject) {

    String sql = "UPDATE " + SqlTablesConstants.SQL_TABLE_NAME_USER_META + " SET "
            + "first_name = ?, "
            + "last_name = ?, "
            + "phone_number = ?, "
            + "birthday = ?, "
            + "home_town = ?, "
            + "profession = ? "
            + "WHERE user_id = ?";

    connect();

    try {
        prpstm = conn.prepareStatement(sql);
        prpstm.setString(1, userMetaObject.getFirstName());
        prpstm.setString(2, userMetaObject.getLastName());
        prpstm.setString(3, userMetaObject.getPhoneNumber());
        prpstm.setDate(4,userMetaObject.getBirthday());
        prpstm.setString(5, userMetaObject.getHomeTown());
        prpstm.setString(6, userMetaObject.getProfession());
        prpstm.setInt(7, userMetaObject.getUserId());
        prpstm.executeUpdate();
    } catch (SQLException e) {
        LOG.error(e.toString());
        return null;
    } finally {
        close();
    }
    return userMetaObject;
}
当我尝试将其直接粘贴到终端时,它成功了:

UPDATE user_meta SET first_name = "John", last_name = "Doe", phone_number = "81549300", birthday = "1988-05-24 00:00:00", homeTown = "Lillehammer", profession="Student" WHERE user_id = 21;

我做错了什么?如果您需要更多信息,请告诉我。

当您在控制台中尝试查询时,出现了用户_id=5,但用户_id=21出现异常。似乎您已经有了用户_id=21的行

当我有这种奇怪的行为时,问题可能与您可能不知道的某个触发器有关,如果不知道,我会怀疑您的主键也是外键,有些数据库在这方面有问题。

对此我很抱歉。那只是因为我抄错了行。你看,我试过好几次了。。我已经纠正了打字错误。而且,我确实希望更新现有字段,而不是创建新行。仅供参考:有一个用户的user_id=5和user_id=21。使用准备好的语句而不是直接写入控制台有什么不同?数据库应该同时允许或不允许,对吗?这很难回答,如果您的程序处于自动提交模式,而控制台未处于自动提交模式,或者如果您在打开的事务中运行控制台查询,然后在事务仍处于挂起状态时运行该程序,或者也许你的程序在你的更新之前运行了其他可能干扰的程序,这些仅仅是阳性,也许你会考虑运行更多的测试。当我遇到难题时,我会编写最小的程序来重现它。我记得我有一个Oracle数据库的问题,它在更新后产生了垃圾,最后它是数据库中的一个bug。谢谢你的输入。如果我找到了,我会发布一个解决方案。